2

我正在向 NerdDinner 解决方案添加单元测试,并遇到了这个问题。我正在测试这里给出的 Edit POST 方法:

    [AcceptVerbs(HttpVerbs.Post), Authorize]
    public virtual ActionResult Edit(int id, FormCollection formValues)
    {
        Dinner dinner = dinnerRepository.GetDinner( id );
        if (!dinner.IsHostedBy(User.Identity.Name))
        {
            return View(Views.InvalidOwner);
        }
        try
        {
            UpdateModel(dinner);
            dinnerRepository.Save();

            //return RedirectToAction("Details", new { id = dinner.DinnerID });
            return RedirectToAction(Actions.Details(dinner.DinnerID));
        }
        catch (Exception ex)
        {
            foreach (var issue in dinner.GetRuleViolations())
            {
                ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
            }
            return View(new DinnerFormViewModel(dinner));
        }
    }

System.TypeInitializationException 在“return RedirectToAction ...”行中被抛出,并显示“'MVC' 的类型初始化程序引发了异常。”

当我用原始行(上面注释掉)替换 T4MVC 编码的行时,我没有得到异常。

下面是单元测试代码:

    [TestMethod]
    public void EditAction_Should_Redirect_When_Update_Successful()
    {
        // Arrange
        var controller = CreateDinnersControllerAs("Some User");
        var formValues = new FormCollection
                             {
                                 { "Title", "Another Value" },
                                 { "Description", "Another Description" }
                             };
        controller.ValueProvider = formValues.ToValueProvider();

        // Act
        var result = controller.Edit(1, formValues) as RedirectToRouteResult;

        // Assert
        Assert.IsNotNull(result);
        Assert.AreEqual("Details", result.RouteValues["Action"]);
    }

我有几个想法可能会导致抛出此异常,但我不确定是否可以在这里提出。我完全不清楚如何解决它。

想法?

戴夫

4

2 回答 2

2

MVC 是 T4MVC 生成的一个类。您看到的错误仅仅意味着在这个生成的 MVC 类的构造函数中引发了异常(请注意,在这个意义上,“构造函数”也意味着初始化任何在声明时分配了值的字段)。

打开并保存 T4MVC.tt 文件以确保您的代码生成的文件是最新的。如果这没有帮助,并且您使用的是可用的最新版本,请在生成的 MVC 类的构造函数中设置断点以找出中断它的原因。

于 2011-03-09T18:43:15.590 回答
0

对于那些可能跟在我后面的人——使用 T4MVC 在测试过程中引入了交叉依赖关系。本质上,T4MVC 会为您的所有控制器生成新的部分类,这可能会导致问题。在我的例子中,MVC 构造函数试图创建 RSVPController,由于我还没有触及它,它仍在尝试连接到数据库。我不确定如何将用于单元测试的单独控制器与混合中的 T4MVC 解耦,因为它涉及到所有内容。如果您有想法,请告诉我...

戴夫

于 2011-03-10T17:04:56.757 回答