Как проверить два объекта равны в xunit.net?

Я читаю Test Driven Разработка: На Примере. Во всех примерах используются Java и Junit (я нахожусь в главе 10). Существует один метод тестирования, который проверяет равенство двух объектов. Я уже переопределяю Equals класса, но при запуске моего теста он не удался.

это пример кода

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 method, какой метод я должен использовать?

обновление
Я проверяю это на Windows 7, Бета-Версия Visual Studio 11, xunit.net 1.9.0.1566 (получить файлы из nuget)

1 ответов


перед сравнением обоих объектов с помощью метода T Equals xunit сравнивает типы:

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

как я вижу, у вас есть два варианта:

простой выбор

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

это может быть менее ожидаемым, чем равная перегрузка, но поцелуй...

менее простой выбор

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());

в этом случае, считают этой.

пока кто-то добавит новая перегрузка (не должна быть сложной, так как внутренняя реализация имеет параметр bool для этого) или расширение, я бы рекомендовал использовать простой метод выше.