我正在尝试使用简单类的两个实例来理解如何使用CreateProxy()
的{{1}}功能。
Likeness<T>()
通过以下测试,我使用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
我必须做错事,但我已经阅读了我在Ploeh博客上找到的所有内容,并且找不到足够简单的例子来与我正在做的事情进行比较。有什么想法吗?
答案 0 :(得分:5)
如果在代理实例上分配值(在调用CreateProxy
方法之后),则测试通过:
[Fact]
public void Equality_Behaves_As_Expected()
{
// AutoMoqCustomization is not necessary.
var original = new Fixture().Create<Band>();
var likeness = original
.AsSource()
.OfLikeness<Band>()
.Without(x => x.Brass)
.CreateProxy();
likeness.Brass = "foo"; // Ignored.
likeness.Strings = original.Strings;
Assert.True(likeness.Equals(original));
likeness.Should().Be(original);
likeness.ShouldBeEquivalentTo(original);
}
请注意,Likeness
会在目标类型上创建代理,并且只有该类型的实例会覆盖Equals
。
由于 source 类型保持不变,以下断言将不会成功:
Assert.True(original.Equals(likeness));
original.Should().Be(likeness);
original.ShouldBeEquivalentTo(likeness);
<强>更新强>
从版本3.0.4及更高版本开始,值会自动复制到代理实例(这意味着likeness.Strings = original.Strings;
将自动发生)。