Как Assert.AreEqual сравнивает два объекта в модульных тестах.net?
Я пишу модульный тест для некоторого кода.net, который я написал.
Я знаком с написанием кода следующим образом:
int expected = 10;
int actual = multiplyByTwo(5);
Assert.AreEqual(expected, actual);
В случае если аргументы являются целыми числами, ясно, что ожидать от кода.
Что делает код, когда переданные аргументы являются объектами?
Если я написал пользовательскую классификацию под названием MyClass
как я могу контролировать, когда Assert.AreEqual
проходит и потерпел неудачу с объектами типа MyClass
?
3 ответа
Официальная документация довольно лаконична и не объясняет этого, поэтому я считаю, что если объекты не являются примитивами, то их ссылки будут сравниваться.
То есть две ссылки на один и тот же объект будут оцениваться как равные; два клона одного и того же объекта оцениваются как разные. Если вы не перегружаете Equals()
метод экземпляра класса (ов), к которому принадлежат эти объекты, или ==
оператор для указанного класса (классов).
Также см. Ответ Рида Копси.
Что делает код, когда переданные аргументы являются объектами?
В этом случае это не так. Это звонит Assert.AreEqual<int>(expected, actual);
,
Assert.AreEqual
Метод имеет много перегрузок. В этом случае лучший матч для двоих Int32
значения - это общая перегрузка. Поскольку это "лучшее совпадение", компилятор выберет эту перегрузку.
Внутри он будет работать с целыми числами:
Проверяет, что два указанных данных универсального типа равны, используя оператор равенства.
Что касается второй части вашего вопроса:
Если я написал пользовательскую классификацию с именем MyClass, как я могу контролировать, когда Assert.AreEqual проходит и терпит неудачу с объектами типа MyClass?
Assert.AreEqual использует оператор равенства (==) для проверки, как определено выше.
Если объекты сериализуются, вы можете сериализовать их, а затем сравнить сериализованные версии.
Вы можете использовать этот метод расширения XmlSerialize для обработки сериализации.
Например, при сравнении экземпляров класса Cat
, следующий код псевдо демонстрирует это
var expected = GetExpectedInstance(); // returns the expected result
var actual = CallMethodUnderTest(); // get the actual result
var e = expected.XmlSerialize<Cat>();
var a = actual.XmlSerialize<Cat>();
Assert.AreEqual(e, a);