C# UnitTest — Assert.AreEqual() не вызывает Equals, если аргумент равен нулю

StackOverflow https://stackoverflow.com/questions/460371

Вопрос

Недавно я наткнулся на, казалось бы, странное поведение, которое Google совершенно не смог объяснить.


using Microsoft.VisualStudio.TestTools.UnitTesting;

class TestClass
{
    public override bool Equals(object obj)
    {
        return true;
    }
}

[TestMethod]
public void TestMethod1()
{
    TestClass t = new TestClass ();
    Assert.AreEqual (t, null); // fails
    Assert.IsTrue (t.Equals (null)); // passes
}

Я ожидаю, что этот тест пройдет успешно.Однако в Visual Studio 2008/.NET 3.5 это не удается.Так и задумано или это баг?

Это было полезно?

Решение

Ваш TestClass нарушает договор Object.Equals. Assert.AreEqual вполне обоснованно полагается на этот контракт.

В документах указано (в списке требований):

  • x.Equals(нулевая ссылка (Nothing в Visual Basic)) возвращает false.

Другие советы

При проверке на нулевые значения не используйте Assert.AreEqual.

Для этого вы должны использовать Assert.IsNull().

Первый тест не пройден. Проверьте, если & Quot; t & Quot; имеет значение null, но это не так, потому что вы инициализировали t новым объектом TestClass.

Второй тест пройден, потому что t.Equals всегда возвращает true.

Если один тест не пройден, весь TestMethod1 помечается как неудачный.

Нет, это правильно - вы инициализировали t для нового объекта TestClass, который не равен NULL, поэтому утверждение не выполнено.

Если я вас правильно понял, на самом деле предполагается, что AreEqual(anythingButNull, null) всегда возвращает false?

(правка) Причина, по которой я задумался, заключается в том, что тест на нулевое значение, как того требует контракт Equals, не вызывается при тестировании модуля на класс. Так как AreEqual опирается на контракт, он не может проверить, соответствует ли мой класс контракту. Так что я думаю, что я должен использовать обходной путь Assert.IsFalse(blah.Equals(null)).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top