C# IQueryable单元或集成测试

C# IQueryable单元或集成测试,c#,linq,unit-testing,testing,asp.net-web-api,C#,Linq,Unit Testing,Testing,Asp.net Web Api,我有一个web api,我公开了一个端点,如下所示: api/Holiday?name={name} 这是web api的控制器获取方法: public IQueryable<Holiday> GetHolidayByName(string name) { return db.Holiday.Where(n => string.Equals(n.Name, name)); } public IQueryable GetHolidayByName(字符串名称) { 返回

我有一个web api,我公开了一个端点,如下所示:

api/Holiday?name={name}

这是web api的控制器获取方法:

public IQueryable<Holiday> GetHolidayByName(string name)
{
    return db.Holiday.Where(n => string.Equals(n.Name, name));
}
public IQueryable GetHolidayByName(字符串名称)
{
返回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);        
}
[TestMethod]
公共无效GetHoliday_GetHolidayByName()
{
//安排
HolidaysController=新的HolidaysController();
//表演
IQueryable actionResult=controller.GetHolidayByName(“西班牙”);
//断言
Assert.IsNotNull(actionResult);
//任何检查名称的尝试都将导致失败
//例如,这失败了
var result=controller.GetHolidayByName(“西班牙”)作为OkNegotiatedContentResult;
Assert.AreEqual(“西班牙”,result.Content.Name);
}
公共接口存储库
{
IQueryable GetHolidayByName(字符串名称)
}
公共类DbRepository:IDBRository
{
公共IQueryable GetHolidayByName(字符串名称)
{
返回db.Holiday.Where(n=>string.Equals(n.Name,Name));
}
}
私有IDbRepository_dbRepository//初始化,最好通过construtor初始化
公共IQueryable GetHolidayByName(字符串名称)
{
return uDBRepository.GetHolidayByName(名称)
}

首先,我认为您应该测试db结果,而不是对象。模拟您的方法,为您提供“Holiday”项,然后覆盖对象上的“equals”方法,或者只是比较您需要检查的属性。测试如下所示,您可以使用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));
}
[TestMethod]
公共无效GetHoliday_GetHolidayByName()
{
//安排
string name=“西班牙”;
HolidaysController=新的HolidaysController();
//表演
IQueryable actionResult=controller.GetHolidayByName(名称);
//断言
Assert.IsNotNull(actionResult);
IsTrue(actionResult.All(n=>string.Equals(n.Name,Name));
}
这里的假设是db将为您提供所需的测试数据。否则,您将不得不进行一些设计更改,以允许提供模拟/伪数据


如果您连接到一个实际的数据库,那么这更多的是一个集成测试,而不是一个单元测试。

mock
db.Holiday
,使用您硬编码的项目构建它,然后调用
GetHolidayByName
并验证结果
[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));
}