Почему Assert.AreEqual (T obj1, Tobj2) завершается ошибкой с идентичными объектами - PullRequest
8 голосов
/ 17 октября 2011

У меня есть класс, который содержит несколько структур:

public class NavigationMenu
{
    public struct NavigationMenuItem
    {
        public bool Enabled { get; set; }
        public int NumberOfPendingOperations { get; set; }
    }

    public NavigationMenuItem SubmitExpenses { get; set; }
    public NavigationMenuItem ManageExpenses { get; set; }
    public NavigationMenuItem SubmitBudgets { get; set; }
    public NavigationMenuItem ManageBudgets { get; set; }
    public NavigationMenuItem AuthorizeExpenses { get; set; }
    public NavigationMenuItem ApproveExpenses { get; set; }
    public NavigationMenuItem PayExpenses { get; set; }
    public NavigationMenuItem BillExpenses { get; set; }
    public NavigationMenuItem ManageReturnedExpenses { get; set; }
    public NavigationMenuItem ManageIncompleteExpenses { get; set; }
    public NavigationMenuItem ManageOrders { get; set; }
    public NavigationMenuItem ApproveBudgets { get; set; }
    public NavigationMenuItem AdministrateSystem { get; set; }
}

В модульном тесте я вызываю функцию и сравниваю результаты:

NavigationMenu expected = new NavigationMenu();
        expected.SubmitExpenses = new NavigationMenu.NavigationMenuItem { Enabled = true };
        expected.ManageExpenses = new NavigationMenu.NavigationMenuItem { Enabled = true };

        NavigationMenu actual = HomeControllerHelper.GetNavigationMenuByUserRole(userRole);

        Assert.AreEqual(expected, actual);

Но Assert.AreEqual всегда генерирует исключение AssertFailedException. Объекты идентичны, я проверил это с помощью отладчика. Пожалуйста, поделитесь любыми идеями. Спасибо.

Ответы [ 3 ]

6 голосов
/ 17 октября 2011

Вызов Assert.AreEqual (ожидаемый, ожидаемый) не должен завершиться ошибкой. Если вы допустили ошибку в своем вопросе и имели в виду Assert.AreEqual (ожидаемый, фактический) , а ваш HomeControllerHelper.GetNavigationMenuByUserRole возвращает новый экземпляр NavigationMenu, то вызов Assert.AreEqual всегда будет вызывать ошибку Тип NavigationMenu является классом и, следовательно, ссылочным типом, даже если для свойств экземпляров установлены одинаковые значения.

Assert.AreEqual выполняет проверку на равенство, если две переменные указывают на одну и ту же ссылку (иначе. ReferenceEqual), а не если две ссылки содержат одинаковые значения (свойства).

Вы можете переопределить метод Equals вашего класса NavigationMenu, чтобы обеспечить пользовательскую реализацию, если два экземпляра вашего класса равны.

3 голосов
/ 17 октября 2011

Потому что вы (вероятно) сравниваете два разных экземпляра объекта, но с одинаковыми параметрами.Чтобы объекты были «равны», необходимо переопределить метод Equals для объекта и выполнить сравнение там.

3 голосов
/ 17 октября 2011

Предполагая, что это должно быть Assert.AreEqual(expected, actual);, как было сказано в комментариях выше:

Вы должны определить, как сравнивать NavigationMenuItem объекты.Он только проверяет, если это один и тот же экземпляр, и, очевидно, они не настолько утвердительны, должны потерпеть неудачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...