我正在处理的模块包含一个项目列表,并且有一种方法可以根据特定条件查找和返回该列表中的项目。规范声明“......如果找到几个匹配值,则可以返回任何一个”
我正在尝试用Nunit写一些测试,我找不到任何能让我很好地表达这个条件的东西(即返回的对象必须是A或B,但我不介意哪个)< / p>
当然,我可以很容易地编写一个代码,设置一个布尔值来判断结果是否符合预期,然后在该布尔值上做一个简单的断言,但这整个问题让我想知道这是否是一个“红旗”单元测试以及是否有更好的解决方案。
有经验的单元测试人员通常如何处理可接受输出范围并且您不希望将测试与特定实现相关联的情况?
答案 0 :(得分:2)
由于你的问题是一般的形式,我只能给出一个相当普遍的答案,但是例如......
Assert.That(someObject, Is.TypeOf<A>().Or.TypeOf<B>());
Assert.That(someObject, Is.EqualTo(objectA).Or.EqualTo(objectB));
Assert.That(listOfValidOjects, Contains.Item(someObject));
这取决于您正在测试的细节。
答案 1 :(得分:0)
我来自Java,JUnit和参数化测试,但似乎nunit也支持这些(参见here)。
可以使用它来为您的不同变量生成值(并且“生成器”也可以跟踪预期的整体结果)。
使用这种方法,您可能会找到避免“硬编码”所有潜在输入值组合的方法(如上所述:真正生成它们);但至少你应该能够编写代码,其中不同输入值的信息与预期结果在源代码中更好地“共处”。