#c# #unit-testing #nunit
#c# #модульное тестирование #nunit
Вопрос:
У меня есть класс, который содержит несколько структур:
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);
Но утверждение.AreEqual всегда выдает исключение AssertFailedException. Объекты идентичны, я проверил это с помощью отладчика. Пожалуйста, поделитесь любыми идеями. Спасибо.
Комментарии:
1. Пожалуйста, укажите язык, который вы используете.
2. Какую платформу модульного тестирования вы используете? NUnit? MSTest? MbUnit? Что-то еще? (пожалуйста, обновите свои теги).
3. Вы сравниваете одни и те же объекты здесь, вы уверены, что это не удается?
4. @narek: ты имеешь в виду Assert. AreEqual (фактический, ожидаемый)? Вы ввели Assert.AreEqual(ожидаемый, expected)
5. Должно ли это быть
Assert.AreEqual(expected, actual);
?
Ответ №1:
Вызов Assert.AreEqual (ожидаемый, expected) не должен завершаться ошибкой. Если вы допустили ошибку в своем вопросе и имели в виду утверждение.AreEqual (ожидаемый, фактический) и ваш HomeControllerHelper.GetNavigationMenuByUserRole возвращает новый экземпляр NavigationMenu, после чего выполняется вызов Assert.AreEqual всегда терпит неудачу, потому что ваш тип NavigationMenu является классом и, следовательно, ссылочным типом, даже если вы задаете свойствам экземпляров одинаковые значения.
Утверждение.AreEqual выполняет проверку на равенство, если две переменные указывают на одну и ту же ссылку (иначе. ReferenceEqual) и нет, если две ссылки содержат одинаковые значения (свойства).
Вы могли бы переопределить метод Equals вашего класса NavigationMenu, чтобы предоставить пользовательскую реализацию, если два экземпляра вашего класса равны.
Комментарии:
1. В примере, который он привел, он сравнивает ту же переменную.
2. Вероятно, он имел в виду Assert. AreEqual (ожидаемый, фактический), так что ваш ответ правильный
3. Должно быть Assert. AreEqual (ожидаемый, фактический), извините за путаницу и большое спасибо за ответ.
Ответ №2:
Потому что вы (вероятно) сравниваете два разных экземпляра объекта, но с одинаковыми параметрами. Для того, чтобы объекты были «равными», вам необходимо переопределить метод Equals для объекта и реализовать там сравнение.
Комментарии:
1. … и также реализует GetHashCode()
Ответ №3:
Предполагая, что это должно быть Assert.AreEqual(expected, actual);
, как было указано в комментариях выше:
Вы должны определить, как сравнивать NavigationMenuItem
объекты. Atm проверяет его только в том случае, если это один и тот же экземпляр, и, очевидно, они не настолько убедительны, чтобы потерпеть неудачу.