我只是设置了一些第一个单元测试,我不太清楚我试图实现的目标(使用我当前的测试结构)可以完成,这意味着我不确定我的测试方法是否是不正确,或者它只是对 xUnit 的限制。
我正在测试我的 MVC Controllers
,并希望确保它们都提供一个ArgumentNullException
如果它们被构造为传递 null 作为参数(它们在现实世界中通过 Castle 得到解决)。
所以,我在 Test 类上有一个私有字段:
private IEnumerable<Type> ControllerTypes = typeof(MyBaseController).Assembly.GetTypes().Where(t => IsController(t));
然后,我的测试方法:
[Fact]
public void EnsureControllersThrowIfProvidedWithNull() {
foreach (var controller in ControllerTypes) {
var ctrs = GetConstructorsForType(controller);
if (null == ctrs || !ctrs.Any()) { //if the controller has no constructors, that's fine, we just skip over it
continue;
}
var ctr = ctrs.ElementAt(0);
var ctrParamsAsNull = ctr.GetParameters().Select(p => (object)null);
Assert.Throws<ArgumentNullException>(() => {
ctr.Invoke(ctrParamsAsNull.ToArray());
});
}
}
所以这一切都很好,我运行了测试运行器,并且我Controllers
的一个在传递时没有抛出ArgumentNullException
null,很好,我的测试失败了,但我不知道它是哪个控制器,从给定的输出。
我确实知道如何通过测试进行调试以查看哪个失败了,并且可以手动检查我的所有控制器以检查它是哪个,但是知道哪个控制器失败了会很有用。
或者我只是在这里使用了错误的单元测试?
(旁注,还有另一个测试可以确保每个控制器只有一个公共构造函数,所以我可以确定当它触发时我的目标是正确的构造函数,只要第一个测试通过)。
谢谢
注意:
测试的逻辑存在缺陷,这意味着它也没有完全涵盖我的预期,只要它对ArgumentNullException
至少 1 个参数抛出一个,那么它将通过测试,即不对。但是,由于参数是接口,我无法实例化它们的新实例。所以任何想要复制测试代码的人,我都不会这样做。不是在这里寻找该问题的解决方案。