为什么不使用AutoFixture Freeze,SemanticComparison Likeness和CreateProxy进行简单的测试?

时间:2013-03-18 06:38:30

标签: autofixture semantic-comparison

我正在尝试使用简单类的两个实例来理解如何使用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博客上找到的所有内容,并且找不到足够简单的例子来与我正在做的事情进行比较。有什么想法吗?

1 个答案:

答案 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;将自动发生)。