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);
}
测试如下所示,您可以使用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"方法,或者只比较需要检查的属性