Недавно я наткнулся на кажущееся странным поведение, которое 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 это не работает. Это должно быть так или это ошибка?
🤔 А знаете ли вы, что...
C# был представлен в 2000 году и стал частью платформы .NET Framework.
При тестировании на нули не используйте Assert.AreEqual
.
Для этого нужно использовать Assert.IsNull()
.
Первый тест не удался. Проверьте, имеет ли "t" значение NULL, но это не так, потому что вы инициализировали t с помощью нового объекта TestClass.
Второй тест проходит, потому что t.Equals всегда возвращает true.
Если один тест терпит неудачу, весь TestMethod1 помечается как неудачный.
Нет, это правильно - вы инициализировали t новым объектом TestClass, который не равен нулю, поэтому утверждение не выполняется.
Если я вас правильно понял, на самом деле предполагается, что AreEqual(anythingButNull, null)
всегда возвращает false?
(править) Причина, по которой я задумался, заключается в том, что проверка на null, как того требует контракт Equals, не вызывается при модульном тестировании класса. Так как AreEqual полагается на контракт, он не может проверить, соответствует ли мой класс контракту. Так что я думаю, мне нужно использовать обходной путь Assert.IsFalse(blah.Equals(null))
.