2013-03-18 108 views
6

我想了解如何使用Likeness<T>()CreateProxy()功能使用兩個簡單類的實例。爲什麼不使用AutoFixture Freeze,SemanticComparison Likeness和CreateProxy進行簡單測試?

public class Band 
{ 
    public string Strings { get; set; } 
    public string Brass { get; set; } 
} 

具有以下測試中,我用一個FixtureCreate<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博客等,以及我在做什麼不能找到合適的很簡單的比較爲例。有任何想法嗎?

回答

4

如果分配在代理實例的值(調用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

由於型保持不變,以下斷言將不會成功:

Assert.True(original.Equals(likeness));
original.Should().Be(likeness);
original.ShouldBeEquivalentTo(likeness);

更新

從3.0.4版本及以上值自動複製到代理實例(w這意味着,likeness.Strings = original.Strings;將自動發生)。

+0

但爲什麼'Assert.True(likeness.Equals(original));'失敗? OP聲明這行代碼也失敗了。不應該通過? – 2013-03-18 17:37:44

+0

因爲這些值未在代理實例上分配。 'Assert.True(likeness.Equals(original));'如果'CreateProxy'將原始測試中的所有屬性從源實例複製到目標實例,則可以通過原始測試。 – 2013-03-18 17:57:30

+0

@尼克斯 - 好吧,所以這裏所說的一個概念是,等式斷言不是雙向的(意思是說,如果使用代理間接修改對象的等同比較器,那麼對象的代理平等必須是行使的 - 不是與其進行比較的對象的平等比較器(如果我使用錯誤的術語,請隨時編輯此評論) – Jeff 2013-03-18 18:07:03

相關問題