2012-04-28 103 views
4

我在閱讀Test Driven Development: By Example。所有示例都使用Java和Junit(我在第10章中)。有一種測試方法可以測試兩個對象的相等性。我已經覆蓋了這個類的Equals,但是運行我的測試失敗了。如何在xunit.net中測試兩個對象是否相等?

這是示例代碼

public class BaseX 
{ 
    public string Test { get; set; } 

    public override bool Equals(object obj) 
    { 
     return this.Test == ((BaseX)obj).Test; 
    } 

    public override string ToString() 
    { 
     return string.Format("Tyep: {0}, Test: {1}", this.GetType().Name, this.Test); 
    } 
} 

public class A : BaseX 
{ 

} 

這是我的測試代碼

[Fact] 
public void FunTest2() 
{ 
    var b1 = new BaseX(); 
    var a1 = new A(); 

    b1.Test = "a"; 
    a1.Test = "a"; 

    Assert.Equal(a1, b1); 
} 

當我運行測試,它會失敗,此消息。

TDD1.UnitTest.UnitTest1.FunTest2 : Assert.Equal() Failure 
Expected: Tyep: A, Test: a 
Actual: Tyep: BaseX, Test: a 

我認爲Assert.Equal比較價值和對象的類型。於是,我查看了xunit代碼,發現Assert.Equal請致電IEqualityComparer.Equals。如果我想用override方法比較兩個對象,我應該使用什麼方法?

更新
我測試這對Windows 7的的Visual Studio 11 Beta版xunit.net 1.9.0.1566使用T-的equals(得到的NuGet文件)

+1

'測試'是受保護的,那麼如何在測試中說'var b1.Text =「a」;'?無論如何,如果你讓'Test'公開,然後運行你在這個問題中提供的代碼,它會在我嘗試時通過。 – Matt 2012-04-28 18:22:47

+0

我剛剛更新了我的代碼,並且還添加了關於我的機器的信息。 :) – Anonymous 2012-04-29 08:41:40

回答

3

之前比較兩個對象方法,比較的xUnit類型:

// Same type? 
if (!skipTypeCheck && x.GetType() != y.GetType()) 
    return false; 

在我看來,你有兩個選擇:

簡單的選擇

Assert.True(b1.Equals(a1)); 

它可能不是一個平等的過載,但KISS預期的那麼...

越少簡單的選擇

public class BaseXComparer : IEqualityComparer<BaseX> 
{ 
    public bool Equals(BaseX x, BaseX y) 
    { 
     return x.Test.Equals(y.Test); 
    } 

    public int GetHashCode(BaseX obj) 
    { 
     return obj.Test.GetHashCode(); 
    } 
} 

然後:

Assert.Equal(a1, b1, new BaseXComparer()); 

在這種情況下,請考慮this

直到有人會添加一個新的重載(不應該是棘手的,因爲內部實現有一個bool參數)或擴展,我建議使用上面的簡單方法。

相關問題