2016-08-01 35 views
4

我有一個Web API和我露出像這樣一個端點:IQueryable的單位或集成測試

API /假日名稱= {名}

這是控制器get方法? web api:

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

我該如何編寫一個單元/集成測試來檢查名稱是否相等?我可以檢查結果不爲空但有點困惑我怎麼能檢查的名稱相同:

[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

模擬'db.Holiday',用硬編碼的項目構建它,然後調用'GetHolidayByName'並驗證結果 – Jonesopolis

+0

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

回答

3

測試看起來像這樣,你可以使用linq來驗證所有返回的結果符合您的標準。

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

這裏的假設是db會爲您提供您想要的測試數據。否則,您將不得不進行一些設計更改以允許提供模擬/僞造數據。

如果你連接到一個實際的數據庫,那麼這更多的是一個集成測試,而不是單元測試。

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

首先,我認爲你應該測試分貝的結果,但對象。嘲笑你的方法給你「假日」項目,然後重寫對象的「等於」方法,或者只是分隔你需要檢查的屬性