Ошибка ControllerContext.IsChildAction с фиктивным поведением Строгий.Все вызовы должны иметь настройку - PullRequest
0 голосов
/ 09 июля 2010

Я играю, чтобы узнать, как тестировать действия контроллера ASP.NET MVC.В частности, я пытаюсь смоделировать ControllerContext, чтобы я мог проверить действие, которое обращается к HttpContext.Current.User.Identity.Name.

Я использую Moq.

Все шло довольнохорошо, пока я не включил MockBehavior.Strict.Я знал, что это вызовет исключение, если код не сможет вызвать то, что я отметил Verifiable.По-видимому, он также выдаст исключение, если «дополнительные» методы, в которых я не предоставляю настройки (например, IsChildAction), не будут вызваны.

[TestMethod]

public void Index_Get_AccessesUserIdentityName()
    {

// Arrange

var mock = new Mock<ControllerContext>(MockBehavior.Strict);

mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns("treycarroll").Verifiable();
HomeController controller = new HomeController();
controller.ControllerContext = mock.Object;

// Act
ViewResult result = controller.Index() as ViewResult;

// Assert
mock.Verify();
...
}

Вот действие Controller, которое я тестирую:

public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!"+User.Identity.Name;

        return View();
    }

Исключение срабатывает при возврате View ();заявление выполнено.Сообщение об ошибке говорит мне, что мне нужен метод установки для вызова IsChildAction, поэтому я обновил свой тестовый класс следующим образом:

[TestMethod] 

    public void Index_Get_AccessesUserIdentityName() 
    { 

        // Arrange 

        var mock = new Mock<ControllerContext>(MockBehavior.Strict); 

        string expectedUserName = "treycarroll";

        mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns(expectedUserName).Verifiable();
        mock.SetupGet(m => m.IsChildAction).Returns(true).Verifiable();
        HomeController controller = new HomeController(); 
        controller.ControllerContext = mock.Object; 

        // Act 
        ViewResult result = controller.Index() as ViewResult;
        string actualUserName = controller.ControllerContext.HttpContext.User.Identity.Name;


        // Assert 
        mock.Verify();
        Assert.AreEqual(actualUserName, expectedUserName);
        Assert.IsNotNull(result);            
    } 

...

После чего я получаю похожую ошибкуоб отсутствии метода настройки для ControllerContext.RouteData.В процессе устранения я мог бы добавить методы установки для всех пропущенных вызовов, но это кажется неправильным.Может быть, я неправильно понимаю использование MockBehavior.Strict, но я подумал, что вы включите его, чтобы избежать получения значений по умолчанию для ваших свойств (например, null для объекта User, который я хочу проверить).Что мне здесь не хватает?

1 Ответ

5 голосов
/ 09 июля 2010

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

...