Я изучаю модульное тестирование и Moq для ASP.NET MVC 5. Я пытаюсь написать свой первый модульный тест для действия индекса одного из моих контроллеров.Как я могу использовать Moq для проверки моего действия индекса, которое возвращает список из базы данных?
Вот код для действия индекса.
[Authorize]
public class ExpenseController : Controller
{
private ApplicationDbContext db = new ApplicationDbContext();
// GET: /Expense/
public ActionResult Index()
{
return View(db.Expenses.ToList().Where(m => m.ApplicationUserId == User.Identity.GetUserId()));
}
}
Все, что я хочу сделать, это просто проверить, что возвращаемый вид не является нулевым
Что-то вроде этого
[TestMethod]
public void ExpenseIndex()
{
// Arrange
ExpenseController controller = new ExpenseController();
// Act
ViewResult result = controller.Index() as ViewResult;
// Assert
Assert.IsNotNull(result);
}
Конечно, это не работает из-за подключения к базе данных и использование ApplicationUserId
, так что бы вы, ребята, помогли мне выполнить moq и unit проверить это действие или порекомендовать мне учебник, в котором я могу ознакомиться с насмешкой в ASP.NET MVC.
Рассказать о зависимости от базы данных/dbcontext, а затем вы можете высмеять это в контроллере – Nkosi
@Nkosi Не могли бы вы предоставить мне больше информации. Спасибо. – Baso
Ваш контроллер имеет жесткую зависимость от 'ApplicationDbContext', что затрудняет издевательство над вашим модульным тестом. Вам понадобится реорганизовать ваш dbcontext, чтобы наследовать от абстракции, которая раскрывает функциональность dbcontext, и тогда у вас есть контроллер, зависящий от этой абстракции, а не от конкреции. оттуда вы можете использовать инфраструктуру DI, чтобы внедрить зависимость в свой контроллер, и теперь у вас также есть возможность заменить абстракцию макетной реализацией в ваших тестах, если необходимо, – Nkosi