Шаблоны проектирования вредят хорошему дизайну больше, чем помогают ему.
Дизайн программного обеспечения IMO, особенно хороший дизайн программного обеспечения, слишком разнообразен, чтобы осмысленно отражаться в шаблонах, особенно в небольшом количестве шаблонов, которые люди могут запомнить - и они слишком абстрактны, чтобы люди действительно могли запомнить больше, чем горстку , Так что они мало помогают.
И с другой стороны, слишком многие люди влюбляются в эту концепцию и пытаются применять шаблоны повсеместно - обычно в конечном коде вы не можете найти фактический дизайн между всеми (совершенно бессмысленными) синглетонами и абстрактными фабриками. .
1) Mocking Request.Url в ActionExecutedContext:
var request = new Mock<HttpRequestBase>();
request.SetupGet(r => r.HttpMethod).Returns("GET");
request.SetupGet(r => r.Url).Returns(new Uri("http://somesite/action"));
var httpContext = new Mock<HttpContextBase>();
httpContext.SetupGet(c => c.Request).Returns(request.Object);
var actionExecutedContext = new Mock<ActionExecutedContext>();
actionExecutedContext.SetupGet(c => c.HttpContext).Returns(httpContext.Object);
2) Предположим, вы внедряете оболочку сеанса в открытый конструктор RememberUrlAttribute.
var rememberUrl = new RememberUrlAttribute(yourSessionWrapper);
rememberUrl.OnActionExecuted(actionExecutedContext.Object);
// Then check what is in your SessionWrapper
Результат:
#region usages
using System;
using System.Collections.Specialized;
using System.Web;
using System.Web.Mvc;
using x.TestBase;
using x.UI.y.Infrastructure.Enums;
using x.UI.y.Infrastructure.Filters;
using x.UI.y.Test.Mocks;
using Moq;
//considering switch to NUnit... :D
using Microsoft.VisualStudio.TestTools.UnitTesting;
#endregion
namespace x.UI.y.Test.Unit.Infrastructure.Filters
{
[TestClass]
public class RememberUrlTester : TesterBase
{
private static HttpContextBaseMock _context =
new HttpContextBaseMock();
private static ActionExecutedContextMock _actionContext =
new ActionExecutedContextMock(_context.Object);
[TestMethod]
//"Can save url in session" (i prefer test names in my own language :)
public void SpeejPieglabaatUrlSesijaa()
{
//Arrange
const string _url = "http://www.foo.bar/foo?bar=bar";
_context.RequestMock.SetUrl(_url);
var filter = new RememberUrlAttribute();
//Act
filter.OnActionExecuted(_actionContext.Object);
//Assert
_context.SessionMock.Verify
(m => m.Add(SessionKey.PreviousUrl.ToString(), _url));
}
}
}
Обернутый Mock
Я уверен, что все можно сделать лучше, но я думаю, что это отличное начало, и я Я очень взволнован.
Наконец-то монстр HttpContext взят под контроль! ^^