我正在尝试理解如何使用Likeness<T>()
的CreateProxy()
特性,使用一个简单类的两个实例。
public class Band
{
public string Strings { get; set; }
public string Brass { get; set; }
}
通过以下测试,我使用Fixture
来Create<T>
一个Band
实例,并为两个字符串属性设置值。
[Fact]
public void Equality_Behaves_As_Expected()
{
// arrange
var fixture = new Fixture();
fixture.Customize(new AutoMoqCustomization());
var original = fixture.Create<Band>();
// Brass something like --> "Brass65756b89-d9f3-42f8-88fc-ab6de5ae65cd"
// Strings something like --> "Strings7439fa1b-014d-4544-8428-baea66858940"
// act
var dupe = new Band {Brass = original.Brass,
Strings = original.Strings};
// Brass same as original's like --> "Brass65756b89-d9f3-42f8-88fc-ab6de5ae65cd"
// Strings same as original's like --> "Strings7439fa1b-014d-4544-8428-baea66858940"
我尝试了很多不同的断言方法,但问题的关键似乎是CreateProxy
方法没有填充Band
的属性,因此即使我尝试比较具有相同属性值的两个Band
实例,来自CreateProxy
方法的实例始终具有空值。
// assert
var likeness = dupe.AsSource().OfLikeness<Band>()
.Without(x => x.Brass).CreateProxy();
// Brass & String properties are null using dupe as source of likeness (!)
//var likeness = original.AsSource().OfLikeness<Band>()
// .Without(x => x.Brass).CreateProxy();
// Brass & String properties are null using original as source of likeness (!)
//Assert.True(likeness.Equals(original)); // Fails
//Assert.True(original.Equals(likeness)); // Fails
// below are using FluentAssertions assembly
//likeness.Should().Be(original); // Fails (null properties)
//original.Should().Be(likeness); // Fails (null properties)
//likeness.ShouldBeEquivalentTo(original); // Fails (null properties)
//original.ShouldBeEquivalentTo(likeness); // Fails (null properties)
}
我可能做错了什么,但我已经阅读了Ploeh博客和SO上的所有内容,却找不到一个足够简单的示例来比较我的情况。有什么建议吗?
x
和y
,x.Equals(y)返回的值与y.Equals(x)返回的值相同。但是,由于在上面的测试中源类型没有被代理,因此只能执行代理的Equals
方法。请注意,这使您能够执行非常灵活的比较。 - Nikos BaxevanisCreateProxy
不会将目标类型的属性值复制到代理类型中。(一旦创建了代理,就必须分配属性值,然后进行比较。) - Nikos BaxevanisCreateProxy
方法能够复制公共字段/属性。这样,在调用CreateProxy方法后,就不需要为代理实例分配值了。 - Nikos Baxevanis