2012-06-21 3 views
5

Я использую инфраструктуру XUnit для проверки кода на C#.XUnit Assertion для проверки равенства объектов

Есть ли какой-либо метод assert, доступный в этой структуре, который выполняет сравнение объектов? Мое намерение состоит в том, чтобы проверить равенство каждой из публичных и частных переменных объекта.

Я попробовал те альтернативы, но редко это работает:

1) bool IsEqual = (Obj1 == Obj2) 
2) Assert.Same(Obj1, Obj2) which I couldnt understand what happens internally 
+1

Существует «глубокое сравнение» в xUnit. Вам нужно будет реализовать IEquatable для ваших объектов, а затем Assert.Equals будет работать. – seldary

+1

'Assert.Same()' сравнивается по ссылке; он утверждает, что «Obj1» и «Obj2» являются ** одинаковым ** объектом, а не просто ** выглядят ** одинаково. – TeaDrivenDev

ответ

6

Вы должны иметь собственный компаратор для достижения этой цели, если сравнивать объекты в противном случае они проверяются на основании ссылаются ли они к тому же объект в памяти. Чтобы изменить это поведение, необходимо переопределить метод Equals и GetHashCode, а затем вы можете сделать:

Assert.True(obj1.Equals(obj2)); 

Вот MSDN страница Абт перегрузкой Равно метод: http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx

также склонны комментарий на вопрос: What's the difference between IEquatable and just overriding Object.Equals()?

+1

Я понимаю, что, реализуя пользовательский метод «Равно», эта проверка может быть выполнена. Но есть ли способ сделать слепое сравнение байтов, что облегчит проверку? Это связано с тем, что в конечном итоге у меня будет реализация «Равно» в «Программном обеспечении под тестированием» только для юнит-тестирования. – inquisitive

+1

Я попытался использовать методы сериализации для преобразования обоих объектов в массив байтов, и он сработал. Но это связано с ограничением добавления атрибута [serializable] к моему классу, который имеет частные переменные-члены. Я думаю, что это не очень хорошо в плане дизайна. – inquisitive

8

у меня был подобный вопрос, но, к счастью, я уже использую

using Newtonsoft.Json; 

Так что мне просто пришлось сериализовать его на объект json, а затем сравнить как строку.

var obj1Str = JsonConvert.SerializeObject(obj1); 
var obj2Str = JsonConvert.SerializeObject(obj2); 
Assert.Equal(obj1Str, obj2Str); 
+0

Я считаю это более полезным, чем реализация метода Equals, потому что я бы хотел, чтобы мой утвердительный отказ сказать мне что-то о том, что было не так. В идеале я хотел бы иметь что-то, что может пересекать дерево объектов и накапливать информацию о том, какие свойства/поддеревья не равны и сбой с этой информацией. –

+0

@RikkiGibson не реализует Equals только правильный способ сделать это? Просто добавьте исключения в список в равных для каждого свойства, которое отличается, а затем в конце либо верните true, либо выбросите все исключения. –

+0

Да, но это может быть кропотливо делать в каждом конкретном случае, поэтому я имел тенденцию искать решения на основе отражений в прошлом при сравнении деревьев простых старых объектов, примитивов и коллекций. –

Смежные вопросы