Я выполняю некоторые модульные тесты и издеваюсь над некоторыми свойствами, используя Moq.
Теперь это тест Контроллер (ASP.NET MVC 3). Мои контроллеры получаются от абстрактного контроллера, называемого AbstractController.
Этот контроллер имеет зависимость от Контекста Http (для того, чтобы делать такие вещи, как тематика, логика, специфичная для домена, на основе заголовков HTTP HOST и т.д.).
Это выполняется с помощью свойства WebSiteSettings:
public abstract class AbstractController : Controller
{
public WebSiteSettings WebSiteSettings { get; private set; }
// other code
}
Обратите внимание на частный набор - ctor устанавливает его. Итак, я изменил его на использование интерфейса, и то, что я высмеивал:
public IWebSiteSettings WebSiteSettings { get; private set; }
Затем я создал "FakeWebSiteSettings", который издевается над контентом Http, чтобы читать заголовки HTTP.
Проблема в том, что когда я запускаю тест, я получаю NotSupportedException:
Неверная настройка для не виртуального (переопределяемого в VB) члена: x = > x.WebSiteSettings
Вот соответствующий издевательский код:
var mockWebSiteSettings = new Mock<FakeWebSiteSettings>();
var mockController = new Mock<MyController>(SomeRepository);
mockController.Setup(x => x.WebSiteSettings).Returns(mockWebSiteSettings.Object);
_controller = mockController.Object;
var httpContextBase = MvcMockHelpers.FakeHttpContext();
httpContextBase.Setup(x => x.Request.ServerVariables).Returns(new NameValueCollection
{
{"HTTP_HOST","localhost.www.mydomain.com"},
});
_controller.SetFakeControllerContext(httpContextBase.Object);
Если я создаю свойство WebsiteSettings
virtual - тест проходит.
Но я не могу понять, зачем мне это нужно. Я не переопределяю свойство, я просто издеваюсь над тем, как он настроен.
Я что-то упустил или сделал это неправильно?