2016-06-12 16 views
1

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"); 
      } 
     } 
    } 
} 

Antwort

1

System.InvalidOperationException: Keine Verbindung Zeichenfolge ‚StudentContext‘ genannt konnte in der Anwendung Konfigurationsdatei finden „

die app.config-Datei für das Testprojekt stellen Sie sicher, die richtige Verbindung hat. String-Einstellungen für Ihren EF.

Testprojekt app.config

<connectionStrings> 
    <add name="StudentContext" connectionString="..." providerName="System.Data.EntityClient" /> 
</connectionStrings> 

, wie ich den Controller-Kontext in einem Testprojekt sollte

Ihr Test richtig definieren versuchen, die Laufzeitumgebung zu replizieren. Vorausgesetzt, das erforderliche Minimum zum Testen des SUT.

Vorausgesetzt, dass Sie eine Verbindung zu Ihrer tatsächlichen Datenbank herstellen, dann wäre dies eher ein Integrationstest.

Ich würde vorschlagen, Ihren Datenzugriff zu abstrahieren, so dass Sie es in Komponententests verspotten können.

+1

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. –

+0

Ich stimme Ihrem Vorschlag zur Abstraktion des Datenzugriffs zu. Gibt es ein Stichwort oder einen Suchbegriff, um ein geeignetes Tutorial zu finden? –

+0

Ich würde sagen, für abstrakte Datenzugriffsschicht suchen. – Nkosi