我正在尝试编写一个单元测试来检查某个结果是否正确。但是,有两个结果被认为是正确的。有没有办法用断言做 OR?我知道我可以做 result = x || result = y 并断言这是真的。但我不想看到真!=假,我想看到结果!= x或y。
我使用的框架是 mstest,但我也愿意听取有关 nunit 的建议。
我正在尝试编写一个单元测试来检查某个结果是否正确。但是,有两个结果被认为是正确的。有没有办法用断言做 OR?我知道我可以做 result = x || result = y 并断言这是真的。但我不想看到真!=假,我想看到结果!= x或y。
我使用的框架是 mstest,但我也愿意听取有关 nunit 的建议。
你可以试试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.
NUnit 中有一个很好 的基于约束的断言模型。它允许定义复合约束。在此处查看详细信息
在您的情况下,断言可能会写:
Assert.That(result, Is.EqualTo(1).Or.EqualTo(5));
失败的测试消息将是(例如):
预期:1 或 5
但是是:10
您可以创建您的 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);
}
你可以做:
Assert.IsTrue( result == x || result == y );
最简单的选择是只使用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);
或者,您可以将“正确”值存储在 Collection 中,然后使用CollectionAssert.Contains
.