2012-04-28 60 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参数)或扩展,我建议使用上面的简单方法。

相关问题