Я сейчас на мобильном устройстве, я могу попытаться обновить ответ позже в эти выходные, но это должно помочь вам начать.
Рефакторинг вашего метода, чтобы использовать переменные экземпляра вместо прямого создания экземпляра вметод.Добавьте их в качестве параметров в ваш конструктор.В основном методе создайте свои экземпляры репозитория и передайте их конструктору службы.
Теперь вы можете использовать что-то вроде Moq или провайдера памяти для структуры сущностей.
Что касается того, что тестировать,в основном тестировать каждый кусок логики ветвления.Как минимум, каждая часть оператора if и условия else.Вы также должны проверить, что происходит, когда ваши объекты репозитория не находят то, что вы ищете (например, возвращает ноль).Случайно я считаю по меньшей мере шесть тестов.
Обновление: Браво!Глядя на ваш обновленный код в вопросе, все идет по правильному пути.
В вашем методе тестирования вы захотите добавить:
var foodService = new FoodService(foodRepositoryMock.Object, drinkRepositoryMock.Object);
Это инициализирует вашсервис с фиктивными объектами.
Затем вы захотите вызвать сервис с параметрами теста, такими как:
foodService.UpdateFoodGrade(12, 98.2d);
Последняя часть - проверка вашего объекта питания с использованием утверждений, таких как:
Assert.IsTrue(food.IsPassed) // assuming it should pass in this condition
Assert.Equals(98.2d, food.Grade); // expectedFoodGrade should be what you expected the grade to be after you call UpdateFoodGrade
Похоже, вам также нужно немного конкретизировать экземпляр вашего объекта Drink.Вам нужно указать значение для MinimumPassingGrade
, так как оно используется для управления логикой принятия решений в вашем операторе if, например, если вы хотите, чтобы food.IsPassed = true
вызывал триггер, вы бы создали экземпляр объекта drink следующим образом:
var drink = new Drink() { DrinkId = foodId, MinimumPassingGrade = 50.0d };
Вы могли бы создать методы тестирования для каждого из других различных тестовых случаев, не пройдя минимум, когда он равен счету, если вы не можете найти еду в репо еды или напиток в репо напитка,и т. д.
Еще одно замечание: вам нужно беспокоиться о Verifiable
макетах, когда вам нужно знать, что метод был / не был вызван.Для этих тестов я, вероятно, не проверю, были ли вызваны методы (создает более тесную связь между вашим тестом и реализацией, а не поведением).Вы хотите убедиться, что методы были вызваны, только если что-то в вашем сервисном коде действительно зависит от знания того, что он был вызван.например, если вы используете Entity Framework и хотите убедиться, что не забыли позвонить SaveChanges()
.