我有很多基于反思的测试。对给定类型的给定程序集进行反射测试,例如,在service.dll中查找基于IService的所有内容。我已经这样做了,因为我需要将引用类型传递给我可以用TestCase归属做的测试。代码基本上如下所示:
public static void TestRunnerforTypeList(Type baseType, Func<Type, string, bool> excluder, Action<Type, string> mockResolver, Dictionary<Type, Dictionary<Type, Mock>> mocks, Action<dynamic, Type> assertor, string methodName)
{
foreach (var type in GetTypesToTest(baseType))
{
if (excluder(type, methodName)) continue;
dynamic objectToTest = CreateInstance(type, mocks);
mockResolver(type, methodName);
assertor(objectToTest, type);
}
}
对此的调用如下所示:
[Test]
public void Positive_outcome_for_Get()
{
GeneralTestRunner.TestRunnerforTypeList(typeof(IService<,,>),
_serviceFactoryContext.ExcludeTypeForMethod,
_serviceFactoryContext.ResolvePositiveMockSetup,
_mocks,
(service, type) => Assert.IsNotNull(service.Get(1)),
"Get");
}
这是一个简单的断言,但你明白了。通过这种方式,我获得了TestCase归属的好处,但是使用了引用类型,例如模拟,管道输入。
然而,我还有其他地方使用TestCase,而Resharper选择了这些,并增加了测试阶段的测试次数,有些人没有。
我的问题是有一种方法可以告诉Resharper(或nUnit)每次调用上述断言操作时该数字都会增加吗?
提前致谢;)
答案 0 :(得分:0)
我发现这样做的唯一方法是使用Resharper 6并删除反射方面并使用TestCaseSource属性。 TestCaseSource将指向静态IEnumerable,为每个测试产生工厂引用类型。请参阅以下文档:
http://www.nunit.org/index.php?p=testCaseSource&r=2.5
与问题实现相比,唯一的问题是,如果程序员没有为实例创建者创建模拟,则反射测试将失败,但是仍然会拾取类型(如果它在同一个程序集中)。因此,如果一个懒惰的程序员创建一个基于IService的新类型(例如)没有测试,如果失败,则开箱即用。