3

我正在尝试编写一个单元测试来检查某个结果是否正确。但是,有两个结果被认为是正确的。有没有办法用断言做 OR?我知道我可以做 result = x || result = y 并断言这是真的。但我不想看到真!=假,我想看到结果!= x或y。

我使用的框架是 mstest,但我也愿意听取有关 nunit 的建议。

4

5 回答 5

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.
于 2012-12-16T06:10:43.337 回答
3

NUnit 中有一个很好 的基于约束的断言模型。它允许定义复合约束。在此处查看详细信息

在您的情况下,断言可能会写:

Assert.That(result, Is.EqualTo(1).Or.EqualTo(5));

失败的测试消息将是(例如):
预期:1 或 5
但是是:10

于 2012-12-16T15:11:54.327 回答
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);
}
于 2012-12-16T15:17:42.573 回答
0

你可以做:

Assert.IsTrue( result == x || result == y );
于 2012-12-16T06:13:23.997 回答
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);

或者,您可以将“正确”值存储在 Collection 中,然后使用CollectionAssert.Contains.

于 2012-12-16T06:14:18.160 回答