Сбой Microsoft.Web.Mvc.LinkBuilder.BuildUrlFromExpression при тестировании приложения Asp.net MVC - PullRequest
2 голосов
/ 08 октября 2010

Итак, я пытаюсь протестировать метод контроллера.Я использую MSTest в VS 2010 и Moq 3.1

Метод теста:

    [TestMethod]
    public void TestAccountSignup()
    {
        var request = new Mock<HttpRequestBase>();
        var context = new Mock<HttpContextBase>();

        AccountController controller = new AccountController();
        controller.ControllerContext = new System.Web.Mvc.ControllerContext(context.Object, new RouteData(), controller);

        request.Setup(x => x.Cookies).Returns(new HttpCookieCollection());

        context.Setup(x => x.Request).Returns(request.Object);

        string username = StringHelper.GenerateRandomAlpha(10);

        var res = controller.Register(username, "foozbaaa+" + username + "@example.com", null, true, "Testing!", null);
    }

Мой метод контроллера:

   [CaptchaValidator]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Register(string userName, string email,string existingUsername, bool captchaValid, string heardAbout, string heardAboutOther)
    {
      //Loads of stuff here....

        //cool - all registered
       //This line gives the problem
     return new RedirectResult(this.BuildUrlFromExpression<AccountController>(x => x.AccountCreated()));
     }

Метод контроллера работает очень хорошо, когдане модульное тестирование.

При подобной насмешке и вызове я получаю исключение System.Security.VerificationException в этой последней строке:

Метод Microsoft.Web.Mvc.LinkBuilder.BuildUrlFromExpression: аргумент типа«TController» нарушает ограничение параметра типа «TController».

Теперь очевидно, что AccountController относится к типу TController, иначе он не будет работать, когда не выполняется модульное тестирование.Он наследуется от моего BaseController, который наследуется от обычного контроллера.

У меня такое чувство, что эта ошибка - красная сельдь, из-за насмешек - есть идеи, почему?

Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 08 октября 2010

Это потому, что Futures использует немного другой тип контроллера.

Я не уверен в деталях, но столкнулся с той же проблемой.Это либо Контроллер фьючерсов против Контроллера MVC 2, либо Контроллер MVC 1 против Контроллера MVC 2.

Проверьте, помогает ли полное определение имени типа.

1 голос
/ 08 октября 2010

Как насчет следующего:

[HttpPost]
public ActionResult Register()
{
    return this.RedirectToAction<AccountController>(x => x.AccountCreated());
}

RedirectToAction<T> - это метод расширения для класса Controller, определенного в Microsoft.Web.Mvc.ControllerExtensions (часть фьючерсов ASP.NET MVC).

Теперь гораздо проще провести модульное тестирование.Вам даже не нужно издеваться над контекстом:

// arrange
var controller = new AccountController();

// act
var actual = controller.Register();

И если вы используете отличный MvcContrib.TestHelper , который я настоятельно рекомендую вам, часть утверждения вашего модульного теста можетвыглядеть так:

// assert
actual
    .AssertActionRedirect()
    .ToAction<AccountController>(x => x.AccountCreated());
...