为NUnits结果提供相等

时间:2017-05-09 06:31:03

标签: c# nunit equality

我们在NUnit上有各种参数化测试的Result - 参数。这适用于在.NET中内置相等性的简单类型。但是我想知道是否有一种方法来验证测试方法返回一个复杂的对象:

[TestCase("MyValue", Result = new MyType(...) /* doesn´t work as we can only use compile-time constants for attributes */]
public MyType Check(string value)
{
    var target = ...
    return target.DoSomething(value);
}

假设target.DoSomething返回MyType的实例,测试应该确保返回的实例与我在TestCase中提供的实例相同。由于MyType既没有实现IEquatable也没有覆盖Equals,使用ReferenceEquals来确定相等性当然是正确的。此外,正如我在评论中所提到的,我们无法在属性中创建MyType的实例,因为它不是编译时常量。

那么我们如何为我们的测试提供一个复杂的实例并检查结果是否与那个结果相同?

3 个答案:

答案 0 :(得分:0)

我们可以使用TestCaseSource - 属性来确定一个为测试用例提供更复杂用途的成员。因此,我们也可以返回任何类型的复杂实例。但是,如前所述,我们无法依赖Result - TestCase标记,因为它使用默认的比较器(使用ReferencEEquals隐式地比较了提供的实例与te返回的实例。

所以我们没有提供Result的预期结果,而是作为测试的简单参数,并提供了我们自己的逻辑,用于什么是被认为是平等的:

[TestCaseSource("TestcaseMethod")] 
public MyType Check(string value, MyType expected)
{
    var target = ...
    var actual = target.DoSomething(value);
    bool retVal = // check the properties of actual towards those of expected
    Assert.IsTrue(retVal);
}
public IEnumerable<object> TestcaseMethod()
{
    yield return new object[] { "MyValue", new MyType(/* expected outcome */);
    yield return new object[] { "AnotherValue", new MyType(/* expected outcome */);
}

,其中

public class MyType
{
    // here come the actual values to be compared
}

编辑:在Assert语句中检查相等性的一种更直接的方法是使用EqualConstraint

Assert.That(expected, Is.EqualTo(actual).Using(new MyComparer());

将使用自定义比较器。

答案 1 :(得分:0)

我们使用Fody Equals来比较自定义类Equals,有一个nuget数据包可以安装它。为了使用它只是将Equals作为标题装饰器,你应该能够正确比较它

答案 2 :(得分:0)

ExpectedResult属性只是一点语法上的好处,并且不需要任何方式。你总是可以在方法中添加一个额外的参数,给出预期的值,并在你的测试中以任何你喜欢的方式测试它。

我们没有计划加强NUnit用来检查您的ExpectedResult的内部平等比较。