Может кто-нибудь помочь мне макет этого контроллера ASP.NET MVC с Moq, пожалуйста? - PullRequest
0 голосов
/ 23 июня 2010

Я пытаюсь смоделировать ASP.NET MVC2 Controller, используя Moq , но я получаю ошибку, потому что я пытаюсь смоделировать не перезаписываемое свойство .Как мне это сделать, пожалуйста?

ПРИМЕЧАНИЕ: контроллер, который я пытаюсь смоделировать, - это (abstract) ASP.NET MVC2 Controller ... не пользовательский контроллер.Зачем?Я пытаюсь проверить некоторые пользовательские расширения контроллера , которые я сделал.На самом деле у меня нет собственного класса контроллера.

Код:

// My own test helper magic shiz.
httpContextBaseMock = MockHelpers.GetAnHttpContextBaseMock();

controllerContextMock = new Mock<ControllerContext>();
controllerContextMock.Setup(x => x.HttpContext)
    .Returns(httpContextBaseMock.Object);

controllerMock = new Mock<Controller>();
controllerMock.SetupGet(x => x.RouteData)
    .Returns(RestMockHelpers.MockRouteData().Object);

Эта последняя строка завершается ошибкой с ...

System.ArgumentException: Invalidнастройка на не перезаписываемый элемент: x => x.RouteData

Итак, я подумал, что мне не следует насмехаться над controllerContext, а просто создать его экземпляр ... REA_ANDREW сделал в своем SO вопросе ...

var controllerContext = new ControllerContext(_httpContextBaseMock.Object, 
    new RouteData(), new Mock<ControllerBase>().Object);

var controller = new Controller(); <-- Cannot do this.
                                       Controller class is abstract.

Так что я не уверен, нужно ли мне создавать свой собственный класс поддельных контроллеров, в какой-нибудь вспомогательной утилите тестирования, которая ничего не делает,но просто наследуется от Controller.Затем создайте его экземпляр.

Но я чувствую, что все это должно быть сделано с использованием макетов, вместо того, чтобы начинать с некоторых, а затем делать несколько экземпляров ...

Я так растерялся: (


Обновление:

Меня попросили объяснить, какой код я пытаюсь протестировать. У меня есть собственный ViewResult, который я сделал, и конструктор установил свойство одной строки.Я просто проверяю, установлено ли свойство.

// Act.
var myResult = new MyResult(controllerMock.Object);

// Assert.
Assert.NotNull(myResult);
Assert.AreEqual("controllerName", myResult.ControllerName);

1 Ответ

0 голосов
/ 23 июня 2010

Для тестов я создаю контроллер класса теста внутри класса теста, например:

protected class TestController : Controller { }

А потом у меня есть изолированный класс тестов, который я могу использовать для тестов. Затем вы можете использовать этот экземпляр TestController.

...