IQueryable Unit or Integration Test

本文关键字:Test Integration or Unit IQueryable | 更新日期: 2023-09-27 17:59:40

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

api/假日?name={name}

这是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);        
}

IQueryable Unit or Integration Test

测试如下所示,您可以使用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));
}

这里的假设是数据库将为您提供所需的测试数据。否则,您将不得不进行一些设计更改,以允许提供模拟/伪造数据。

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

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

首先,我认为应该测试数据库结果,而不是对象。模拟您的方法以提供"Holiday"Items,然后覆盖对象上的"equals"方法,或者只比较需要检查的属性