我正在尝试单元测试最佳实践,我遇到了一个我无法理解的问题。生产代码具有将给定对象转换为另一个对象的功能,如下所示:
原始对象:
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]
传递我想要测试的属性?或者测试应该检查所有属性是否相等?
我不认为最后一个是解决方案,因为如果测试失败,那么我们就不知道哪个属性不匹配。
答案 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 ...
);