IQueryable单位或整合测试

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

API /假日?名称= {}名

这是web api的控制器get方法:

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

如何为此检查单元/集成测试以检查名称是否相等? 我可以检查结果是不是null然而有点困惑我怎么能检查名称是否相等:

 [TestMethod] public void GetHoliday_GetHolidayByName() { // Arrange HolidaysController controller = new HolidaysController(); // Act IQueryable 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; Assert.AreEqual("Spain", result.Content.Name); } 

测试看起来像这样,您可以使用linqvalidation返回的所有结果是否满足您的条件。

 [TestMethod] public void GetHoliday_GetHolidayByName() { // Arrange string name = "Spain"; HolidaysController controller = new HolidaysController(); // Act IQueryable actionResult = controller.GetHolidayByName(name); //Assert Assert.IsNotNull(actionResult); Assert.IsTrue(actionResult.All(n => string.Equals(n.Name, name)); } 

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

如果要连接到实际的数据库,那么这更像是集成测试而不是unit testing。

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

首先,我认为您应该测试db结果但是对象。 模拟你的方法给你“假日”项目,然后覆盖对象上的“等于”方法,或者只是分隔你需要检查的属性