Как 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);
Другие вопросы по тегам