1

我对测试很陌生,并且一直在编写我的控制器测试,如下所示:

var result = myController.Create(It.IsAny<int>());

Assert.IsInstanceOfType(result, typeof(ViewResult));
Assert.AreEqual(string.Empty, ((ViewResult)result).ViewName, "Default view expected.");
Assert.IsInstanceOfType(((ViewResult)result).ViewData.Model, typeof(FooBarCreateEditViewModel));

这工作正常,但不那么可读,因为我必须为测试 2 和 3 执行强制转换。另一种方法可能是执行以下操作:

var result = (ViewResult)myController.Create(It.IsAny<int>());

Assert.AreEqual(string.Empty, result.ViewName, "Default view expected.");
Assert.IsInstanceOfType(result.ViewData.Model, typeof(FooBarCreateEditViewModel));

这似乎也有效,并且在我看来更具可读性。我的问题是它依赖于测试的“行为”部分来执行 IsInstanceOfType 测试,而不是明确定义一个 Assert 来完成这项工作。

那么我的第二个方法可以继续吗?如果方法返回不同的类型,我可能会遇到依赖强制转换抛出错误的问题?

4

1 回答 1

1

您可以使用MVCContrib.TestHelper。允许您编写非常易读的单元测试,例如:

// arrange
...

// act
var actual = controller.Create(123);

// assert
actual
    .AssertViewRendered()
    .WithViewData<FooBarCreateEditViewModel>();

查看我编写的以下示例单元测试。

于 2012-08-14T09:21:37.970 回答