我正在为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));
}
}
在“return RedirectToAction ...”行中抛出System.TypeInitializationException,并说“'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"]);
}
我有几个想法可能导致抛出此异常,但我不确定是否可以在此处定位。我完全不清楚如何解决它。
想法?
戴夫
答案 0 :(得分:2)
MVC是由T4MVC生成的类。您看到的错误只是意味着在这个生成的MVC类的构造函数中抛出了异常(请注意,“构造函数”在这个意义上也意味着初始化任何被赋值的字段)。
打开并保存T4MVC.tt文件,以确保您的代码生成文件是最新的。如果这没有帮助并且您使用的是最新版本,请在生成的MVC类的构造函数中设置断点,以找出打破它的原因。
答案 1 :(得分:0)
对于那些可能跟在我后面的人 - 使用T4MVC在测试过程中引入了交叉依赖性。从本质上讲,T4MVC为您的所有控制器生成新的部分类,这可能会导致问题。在我的情况下,MVC构造函数试图创建RSVPController,因为我还没有触及它,它仍然试图连接到数据库。 我不确定如何在混合中将单独的控制器与T4MVC分离,因为它触及了所有内容。如果您有任何想法,请告诉我......
戴夫