Ich habe ein ActionResult, das konsistent in einem MVC 5-Projekt mit EntityFramework und Epplus funktioniert. Durch Klicken auf einen Aktionslink in der Ansicht wird dieses ActionResult ausgelöst, das das ausgewählte Modell an ein neues Excel-Dokument sendet.So definieren Sie einen Controller-Kontext beim Testen eines ActionResult
Ich lerne Einheit zu tun, um meine MVC-Code Testen in Visual Studio 2013 (mit dem Nuget xUnit Paket) und General würde ich klein anfangen, um das Äquivalent einer Hallo-Welt-Test auf der Action tun mit der Behauptung, Das ActionResult ist nicht null.
Der Test mit dieser Antwort fehlgeschlagen: "System.InvalidOperationException : No connection string named 'StudentContext' could be found in the application config file."
Ich verstehe, was die Fehlermeldung bedeutet, aber meine Frage ist, wie ich den Controller-Kontext in einem Testprojekt richtig definieren. Fehle ich etwas Einfaches und Offensichtliches, wie das Definieren einer Kontextvariablen, oder gehe ich das völlig falsch?
Dies ist der Code-Block, den ich verwende, um mein ActionResult zu testen.
using StudentProject.Controllers;
using System.Web.Mvc;
using Xunit;
namespace StudentProject.Tests.Controllers
{
public class StudentRosterControllerTest
{
[Fact]
public void ExportToExcel_IsNotNull()
{
// Arrange
StudentRostersController controller = new StudentRostersController();
ActionResult ExcelExport;
// Act
ExcelExport = controller.ExportToExcel();
// Assert
Assert.NotNull(ExcelExport);
}
}
}
Dies ist der Code, den ich gerade teste. Es handelt sich um einen automatisch eingerüsteten Controller, bei dem die automatisch generierten Crud-Methoden ausgeblendet und die einzelne zu testende Methode angezeigt wird.
using OfficeOpenXml;
using StudentProject.Models;
using System.Collections;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web.Mvc;
namespace StudentProject.Controllers
{
public class StudentRostersController : Controller
{
private StudentContext db = new StudentContext();
// Auto-scaffolded CRUD methods not shown
// This ActionResult exports the StudentRoster model
// to a fresh Excel file.
public ActionResult ExportToExcel()
{
IEnumerable<StudentRoster> query = db.StudentRosters.AsEnumerable();
using (var excelFile = new ExcelPackage())
{
ExcelWorksheet worksheet =
excelFile.Workbook.Worksheets.Add("Sheet1");
worksheet.Cells["A1"].LoadFromCollection(Collection: query,
PrintHeaders: true);
// Results in file downloaded to user's default
// "My Downloads" folder.
return File(excelFile.GetAsByteArray(),
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"Export.xlsx");
}
}
}
}
Was es funktionierte, war: (1) Entity Framework mit Nuget auf mein Testprojekt zu installieren, und (2) das Kopieren der Verbindungszeichenfolge in die Datei app.config zu kopieren. Der Code, wie ich ihn oben gestellt habe, funktioniert jetzt. –
Ich stimme Ihrem Vorschlag zur Abstraktion des Datenzugriffs zu. Gibt es ein Stichwort oder einen Suchbegriff, um ein geeignetes Tutorial zu finden? –
Ich würde sagen, für abstrakte Datenzugriffsschicht suchen. – Nkosi