单元测试断言在几种情况下都是正确的

时间:2012-12-16 05:41:23

标签: c# unit-testing nunit mstest

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

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

5 个答案:

答案 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);
}