Ich lerne Unit-Tests und Moq für ASP.NET MVC 5 zu verwenden. Ich versuche, meinen ersten Komponententest für die Indexaktion eines meiner Controller zu schreiben.Wie kann ich Moq verwenden, um meine Indexaktion zu testen, die eine Liste aus der Datenbank zurückgibt?
Hier ist der Code für die Indexaktion.
[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()));
}
}
Alles, was ich tun möchte, ist überprüfen nur, dass die zurückgegebene Ansicht
So etwas wie diese
[TestMethod]
public void ExpenseIndex()
{
// Arrange
ExpenseController controller = new ExpenseController();
// Act
ViewResult result = controller.Index() as ViewResult;
// Assert
Assert.IsNotNull(result);
}
Natürlich nicht null ist, dies nicht funktioniert, weil die Verbindung zur Datenbank und die Verwendung der ApplicationUserId
so würden Sie mir helfen, moq und Unit-Test diese Aktion oder empfehlen Sie mir ein Tutorial, wo ich mich mit Spott in ASP.NET MVC vertraut machen kann.
Abstrakt die Abhängigkeit der Datenbank/dbcontext und dann können Sie das in den Controller – Nkosi
@Nkosi Mock Würdest du mir bitte weitere Informationen zur Verfügung stellen. Vielen Dank. – Baso
Ihr Controller hat eine harte Abhängigkeit von dem 'ApplicationDbContext', was es schwierig macht, in Ihrem Komponententest herumzuspielen. Sie müssen Ihren dbcontext so umformen, dass er von einer Abstraktion erbt, die die Funktionalität von dbcontext verfügbar macht, und dann hängt der Controller von dieser Abstraktion ab und nicht von der Konkretion. von dort können Sie ein DI-Framework verwenden, um die Abhängigkeit in Ihren Controller zu injizieren, und jetzt haben Sie auch die Flexibilität, die Abstraktion durch eine Scheinimplementierung in Ihren Tests zu ersetzen, wenn es sein muss – Nkosi