Предоставляет ли MS Test значение по умолчанию, равное сравнению? - PullRequest
1 голос
/ 06 июня 2010

Я хочу проверить, например,

int orderId = myRepository.SubmitOrder(orderA);

orderB = myRepository.GetOrder(orderId);

Assert.AreEqual(orderA, orderB); // fail

Очевидно, что здесь нужно сравнение значений, но я не хочу предоставлять переопределенную реализацию Equals для всех моих классов исключительно радитестирование (оно бесполезно в остальной части приложения).

Существует ли предоставленный универсальный метод, который просто проверяет каждое поле с помощью отражения?Или, если нет, то можно написать свой собственный?

РЕДАКТИРОВАТЬ : Кажется, что люди упускают из виду суть.Я не хочу писать свою собственную логику сравнения.Это потребует сотен строк дополнительного кода.Я ищу что-то вроде универсального

bool ContainSameValues<T>(T t1, T t2)

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

ДАЛЬНЕЙШЕЕ РЕДАКТИРОВАНИЕ : поскольку кажется, что нет никакой встроенной поддержки для выполнения чего-то подобного, вы можете увидеть мою (неудачную) попытку написать мою здесь

Ответы [ 3 ]

1 голос
/ 06 июня 2010

Самое простое, что вы можете сами сравнить - примитивные поля:

Assert.AreEqual(orderA.ID, orderB.ID);    
Assert.AreEqual(orderA.CustomerID, orderB.CustomerID);
Assert.AreEqual(orderA.OrderDate, orderB.OrderDate);
0 голосов
/ 06 июня 2010

Поскольку класс Assert является статическим, на нем невозможно создать методы расширения (так как требуется экземпляр). Однако почему бы не создать оболочку для класса Assert, где вы можете выполнять пользовательские утверждения?

например:

public static class MyAssertions
{
    public static void AreOrdersEqual(Order a, Order b)
    {
        if (!OrdersAreEqual) // your comparison logic here
           Assert.Fail("Orders arent equal");           
    }
}

Тогда в вашем тесте:

MyAssertions.AreOrdersEqual(orderA, orderB)
0 голосов
/ 06 июня 2010

Вам нужно будет реализовать IComparable (или ICompare?) В классе Order.method.

...