【问题标题】:IQueryable Unit or Integration TestIQueryable 单元或集成测试
【发布时间】:2016-08-01 19:40:40
【问题描述】:

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

api/Holiday?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);        
}

【问题讨论】:

标签: c# linq unit-testing testing asp.net-web-api


【解决方案1】:

测试看起来像这样,您可以使用 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));
}

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

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

【讨论】:

    【解决方案2】:
    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)
        }
    

    【讨论】:

      【解决方案3】:

      首先,我认为您应该测试数据库结果而不是对象。模拟你的方法给你“假日”项目,然后覆盖对象上的“equals”方法,或者只是比较你需要检查的属性

      【讨论】:

        猜你喜欢
        • 2011-09-29
        • 1970-01-01
        • 1970-01-01
        • 2019-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多