Я провожу модульное тестирование и проверяю некоторые свойства, используя Moq .
Теперь это тест Controller (ASP.NET MVC 3). Мои контроллеры происходят от контроллера abstract , называемого 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 - тест пройден.
Но я не могу понять, зачем мне это нужно. Я на самом деле не переопределяю свойство, я просто высмеиваю, как оно настроено.
Я что-то упустил или делаю это неправильно?