Unit testing 使用Autofixture';s CreateProxy使用相似性、语义比较功能
在一次关于Autofixture的询问中,我发现了一个 我不认为这个失败的测试是由于这个原因,而是我一直在困惑.Without(…).CreateProxy()语法是如何工作的。考虑下面的失败测试,通过创建对象的新实例,将其创建为:,使测试变得稍微复杂一些。Unit testing 使用Autofixture';s CreateProxy使用相似性、语义比较功能,unit-testing,autofixture,stub-data-generation,semantic-comparison,Unit Testing,Autofixture,Stub Data Generation,Semantic Comparison,在一次关于Autofixture的询问中,我发现了一个 我不认为这个失败的测试是由于这个原因,而是我一直在困惑.Without(…).CreateProxy()语法是如何工作的。考虑下面的失败测试,通过创建对象的新实例,将其创建为:,使测试变得稍微复杂一些。 [事实] public void Equality_的行为与预期一致() { //排列:意图->使用夹具创建的标注栏作为对象母带 var template=新夹具().Create(); //动作:意图->实例化带*是SUT var cre
[事实]
public void Equality_的行为与预期一致()
{
//排列:意图->使用夹具创建的标注栏作为对象母带
var template=新夹具().Create();
//动作:意图->实例化带*是SUT
var createdBand=new Band{Brass=template.Brass,
Strings=template.Brass};
//意图->指定不应在比较中考虑.Brass
var likeess=template.AsSource().OfLikeness()。
没有(x=>x.Brass).CreateProxy();//忽略.Brass属性
//[https://stackoverflow.com/a/15476108/533958]显式分配
//相似性属性
likeess.Strings=template.Strings;
likess.Brass=“foo”//应该被忽略
//断言:意图->检查已创建的标注栏和模板标注栏之间的相等性
//包括相似性定义中未排除的所有成员
相似性.Should().Be(createdBand);//失败
相似性。应等效于(createdBand);//失败
Assert.True(likess.Equals(createdBand));//失败
}
这是乐队:
公共类频带
{
公共字符串{get;set;}
公共字符串{get;set;}
}
我的代码不够复杂,无法帮助我理解相似性的源代码一般应该是什么
源是否应该是的输出,在这种情况下,它将与AutoFixture创建的模板实例进行比较
或者源应该是由AutoFixture创建的模板实例,在这种情况下,它将与的输出进行比较
编辑:更正测试中的错误
我意识到我错误地将template.Brass
属性分配给了新Band
实例的Brass
和Strings
属性。更新的测试反映了对var createdBand=new Band{Brass=template.Brass,Strings=template.Strings}
的更正,现在所有六个断言都通过了
[事实]
public void Equality_的行为与预期一致()
{
//排列:意图->使用夹具创建的标注栏作为对象母带
var template=新夹具().Create();
//动作:意图->实例化带*是SUT
var createdBand=newband{Brass=template.Brass,Strings=template.Strings};
//创造的相似性
var createdLikeness=createdBand.AsSource().OfLikeness()。
没有(x=>x.Brass)。CreateProxy();//.Brass不应在比较中考虑
// https://stackoverflow.com/a/15476108/533958 (明确地为相似性指定属性)
createdLikeness.Strings=createdBand.Strings;
createdLikeness.Brass=“foo”//应被忽略
//模板相似性
var templateLikenness=likenness()的template.AsSource()
.无(x=>x.Brass)
.CreateProxy();
templateLikeness.Strings=template.Strings;
templateLikeness.Brass=“foo”;
//断言:意图->将创建的标注栏与模板标注栏进行比较
createdLikeness.Should().Be(模板);
CreatedLikenness.shouldbeequivalento(模板);
True(createdLikenness.Equals(模板));
templateLikeness.Should().Be(createdBand);
模板相似性。应与(createdBand)等效;
True(templateLikeness.Equals(createdBand));
}
你的意思是:
likeness.Should().BeAssignableTo<Band>(); // Returns true.
更新:
createBand和模板实例不受CreateProxy
方法的影响。他们为什么要这样做
使用相似性CreateProxy
基本上可以创建一个
Assert.True(likeness.Equals(createdBand)); // Passed.
如果没有它,原始的相等断言将失败:
Assert.True(template.Equals(createdBand)); // Failed.
但是,以下操作也将失败:
Assert.True(likeness.Equals(template));
它失败,因为Strings
值是来自createdBand实例的值
此行为是预期的,您可以直接使用相似性来验证:
createdBand.AsSource().OfLikeness<Band>()
.Without(x => x.Brass).ShouldEqual(template);
关于显式分配属性,@NikosBaxevanis感谢您为此所做的工作!在那之前,我已经按照你在回答我的上一个问题时的建议做了,那就是显式地将属性值赋给我希望在我要检查相等性的实例中应该出现的属性,除了使用.Without(…)语法排除在相似性之外的任何属性。这部分正确吗?@Lumiris是的,这是正确的。从3.0.4版和更高版本开始,值会自动复制到代理实例(这意味着,createdLikeness.Strings=createdBand.Strings;
将自动发生),这不只是比较类型吗?我想将相似性(从模板创建)与createdBand(从SUT创建)进行比较,以获得相等性(除了在相似性创建中特别排除的成员之外的所有成员)。我有足够的信心,他们将是相同的类型或可分配给相同的类型,我不想明确验证。我将尝试更新问题以更清楚地说明这一点。@Lumirris在更新的测试中,您必须将相似性
代理(目标)与模板实例(源)进行比较。如果我更新为相似性.Should().be(template)
,则测试通过,但它没有检查SUT输出(createdBand
)。但是如果createdBand
被用作相似性源(var-likeness=createdBand.AsSource().OfLikeness().Without(x=>x.Brass).CreateProxy()
和likeness.Strings=createdBand.Strings
),那么SUT的输出将通过like引用
createdBand.AsSource().OfLikeness<Band>()
.Without(x => x.Brass).ShouldEqual(template);
The provided value `Band` did not match the expected value `Band`. The following members did not match:
- Strings.