2016-08-01 20 views
4

Ich habe einen Web-api und ich bin einen Endpunkt wie so aussetzt:IQueryable Einheit oder Integrationstest

api/Ferien name = {name}

Dies ist die Controller get-Methode für? die web api:

public IQueryable<Holiday> GetHolidayByName(string name) 
{ 
    return db.Holiday.Where(n => string.Equals(n.Name, name)); 
} 

Wie kann ich einen Unit/Integration Test für diese schreiben, die prüft, ob die Namen gleich sind? Ich kann das Ergebnis überprüfen jedoch nicht null ist etwas verwirrt, wie ich die Namen gleich sind überprüfen:

[TestMethod] 
public void GetHoliday_GetHolidayByName() 
{ 
    // Arrange 
    HolidaysController controller = new HolidaysController(); 

    // Act 
    IQueryable<Holiday> actionResult = controller.GetHolidayByName("Spain"); 

    //Assert 
    Assert.IsNotNull(actionResult); 

    //any attempt to check names are equal results in a fail 
    //For instance this fails 
    var result = controller.GetHolidayByName("Spain") as OkNegotiatedContentResult<Holiday>; 
    Assert.AreEqual("Spain", result.Content.Name);   
} 
+2

Mock 'db.Holiday', erstellen Sie es mit einem Element, das Sie hardcodieren, dann rufen Sie' GetHolidayByName' auf und überprüfen Sie das Ergebnis – Jonesopolis

+0

http://blog.ploeh.dk/2012/03/26/IQueryableTisTightCoupling/ –

Antwort

3

Der Test würde so aussehen, wo Sie linq verwenden können, um das alles zu überprüfen Das zurückgegebene Ergebnis entspricht Ihren Kriterien.

[TestMethod] 
public void GetHoliday_GetHolidayByName() 
{ 
    // Arrange 
    string name = "Spain"; 
    HolidaysController controller = new HolidaysController(); 

    // Act 
    IQueryable<Holiday> actionResult = controller.GetHolidayByName(name); 

    //Assert 
    Assert.IsNotNull(actionResult); 
    Assert.IsTrue(actionResult.All(n => string.Equals(n.Name, name)); 
} 

Die Annahme hier ist, dass die db Ihnen die gewünschten Testdaten liefert. Andernfalls müssen Sie einige Designänderungen vornehmen, um verspottete/gefälschte Daten bereitzustellen.

Wenn Sie eine Verbindung zu einer tatsächlichen Datenbank herstellen, ist dies eher ein Integrationstest als ein Komponententest.

0
public interface IDbRepository 
{ 
    IQueryable<Holiday> GetHolidayByName(string name) 
} 

public class DbRepository : IDbRepository 
{ 
    public IQueryable<Holiday> GetHolidayByName(string name) 
    { 
     return db.Holiday.Where(n => string.Equals(n.Name, name)); 
    } 
} 
private IDbRepository _dbRepository;//initialize, preferably through construtor 
public IQueryable<Holiday> GetHolidayByName(string name) 
    { 
     return _dbRepository.GetHolidayByName(name) 
    } 
0

Zunächst einmal denke ich, dass Sie sollten db Ergebnisse aber Objekte testen. Verspotten Sie Ihre Methode, um "Holiday" Elemente zu geben, dann überschreiben Sie die "equals" -Methode für das Objekt oder einfach nur die Eigenschaften, die Sie überprüfen müssen