我正在尝试编写一个单元测试,我检查某个结果是否正确。但是,有两个结果被认为是正确的。有没有办法对断言进行OR?我知道我可以做结果= x || result = y并断言这是真的。但不是看到真实!=假,我想看到结果!= x或y。
我使用的框架是mstest,但我也愿意听取有关nunit的建议。
答案 0 :(得分:4)
您可以尝试Fluent Assertions。这是一组.NET扩展方法,允许您更自然地指定预期的结果测试。 Fluent Assertions支持MSTest和NUnit,因此稍后切换到nUnit并不是什么大问题。然后你可以使用以下代码表达你的断言:
// Act phase: you get result somehow
var result = 42;
// Assert phase
result.Should().BeOneOf(new [] { 1, 2 } );
// in this case you'll be following error:
// Expected value to be one of {1, 41}, but found 42.
答案 1 :(得分:3)
NUnit中有一个很好的基于约束的断言模型。它允许定义复合约束。详情请见here
在你的情况下,assert可能会写:
Assert.That(result, Is.EqualTo(1).Or.EqualTo(5));
失败的测试消息将是(例如):
预期:1或5
但是:10
答案 2 :(得分:0)
你可以这样做:
Assert.IsTrue( result == x || result == y );
答案 3 :(得分:0)
最简单的选择是使用Assert.IsTrue
,但也会在失败时传递字符串消息进行打印。该字符串可以提供有关现实如何达不到预期的信息:
Assert.IsTrue(result == x || result == y, "Result was not x or y");
您也可以轻松地在自定义消息中包含实际值:
Assert.IsTrue(result == x || result == y, "Result was not x or y, instead it was {0}", result);
或者,您可以将“正确”值存储在集合中,然后使用CollectionAssert.Contains
。
答案 4 :(得分:0)
如果实际结果可以匹配两个以上的预期值,您可以创建Assert方法:
public void AssertMultipleValues<T>(object actual, params object[] expectedResults)
{
Assert.IsInstanceOfType(actual, typeof(T));
bool isExpectedResult = false;
foreach (object expectedResult in expectedResults)
{
if(actual.Equals(expectedResult))
{
isExpectedResult = true;
}
}
Assert.IsTrue(isExpectedResult, "The actual object '{0}' was not found in the expected results", actual);
}