NUnit如何防止代码重复

时间:2013-10-25 15:44:52

标签: c# unit-testing nunit

我正在尝试单元测试最佳实践,我遇到了一个我无法理解的问题。生产代码具有将给定对象转换为另一个对象的功能,如下所示:

原始对象:

public OriginalObject
{
    public string Id {get; set;}
    public string Value {get; set;}
    public int FormCode {get; set;}
    public int NameCode {get; set;}
    //other properties
}

public TransformedObject
{
    public string Value {get; set;}
    public int FormCode {get; set;}
    //other properties
}

转换功能:

public TransformedObject Transform(OriginalObject originalObject)
{
    var TransformedObject = new TransformedObject();
    TransformedObject.Value = originalObject.Value;
    TransformedObject.FormCode = originalObject.FormCode;
    return TransformedObject;
}

测试看起来像这样:

[Test]
public void Transform_NonNullOptionObject_ValuePropertyIsTheSame()
{
    OptionObjectTransform transform = InitTransform();
    CustomOptionObject result = transform.Transform(optionObject);//mock optionObject
    Assert.AreEqual(optionObject.Value, result.Value);
}

所以我的问题是我必须为每个属性编写测试吗?或者有没有办法使用[TestCase]传递我想要测试的属性?或者测试应该检查所有属性是否相等? 我不认为最后一个是解决方案,因为如果测试失败,那么我们就不知道哪个属性不匹配。

2 个答案:

答案 0 :(得分:0)

NUnit(和所有其他xUnit框架)的限制是它们在第一个断言失败时失败并且不运行其他断言。如你所说,这意味着如果一个人试图通过许多断言测试很多值,就无法检测到多个失败。

但是,正如您所知,许多重复测试,每个测试不同的值都不理想,因为它涉及大量重复的代码,只是为了解决NUnit的限制。

“两全其美”解决方案是测试对象数组是否相等。这可以采取以下形式:

[Test]
public void Transform_NonNullOptionObject_ValuePropertyIsTheSame()
{
    OptionObjectTransform transform = InitTransform();
    CustomOptionObject result = transform.Transform(optionObject);
    var expected = new[] { optionObject.Value, optionObject.FormCode };
    var actual = new[] { result.Value, result.FormCode };
    Assert.AreEqual(expected, actual);
}

这样,您可以通过一次测试测试多个值,并且可以同时了解许多故障。

答案 1 :(得分:0)

对于简单映射(即计算映射很少或“if”s),我使用SharpTestEx,其中有nice Satisfy assertion,报告所有错误的断言。

代码如下:

mapped.Satisfy( m =>
    m.Prop1 == source.SomeData + "zz" &&
    m.Prop2 == source.Prop2 ...
);