Web API的单元测试,获取相同的ID

m密

我不知道如何为我的Web API GET by id方法编写单元测试。

这是我所拥有的:

public void GetProduct_ShouldReturnSameID()
{
    var context = new TestModelContext();
    context.Products.Add(GetDemoProduct());

    var controller = new ProductsController(context);
    var result = controller.GetProduct(3) as OkNegotiatedContentResult<Product>;

    Assert.IsNotNull(result);
    Assert.AreEqual(3, result.Content.Id);
}

我正在尝试测试的控制器方法

public IHttpActionResult GetProduct(int id)
{
    var product = (from t in db.Products.Include(t => t.Reviews)
                          .Where(t => t.Id == id)
                          select t);

    if (product == null || product.Count() == 0)
    {
        return NotFound();
    }

    return Ok(product);
}

我的测试可以在其他控制器上找到,但不能找到这个控制器。我想知道这是怎么回事?我的测试失败并显示

“预期:不为空,但为:空”

public class TestModelContext : IModelContext {
    public TestModelContext() {
        this.Products = new TestProductDbSet();
    }
    public DbSet<Product> Products { get; set; }
    public int SaveChanges() {
        return 0;
    }
    public void MarkAsModified(Product item) { }

    public void Dispose() { }
}

public class TestProductDbSet : TestDbSet<Product> {
    public override Product Find(params object[] keyValues) {
        return this.SingleOrDefault(product => product.Id == (int)keyValues.Single());
    }
}

public class TestDbSet<T> : DbSet<T>, IQueryable, IEnumerable<T>
        where T : class
{
    ObservableCollection<T> _data;
    IQueryable _query;

    public TestDbSet()
    {
        _data = new ObservableCollection<T>();
        _query = _data.AsQueryable();
    }

    // ...

    public override T Create()
    {
        return Activator.CreateInstance<T>();
    }

    public override TDerivedEntity Create<TDerivedEntity>()
    {
        return Activator.CreateInstance<TDerivedEntity>();
    }

    public override ObservableCollection<T> Local
    {
        get { return new ObservableCollection<T>(_data); }
    }

    Type IQueryable.ElementType
    {
        get { return _query.ElementType; }
    }

    System.Linq.Expressions.Expression IQueryable.Expression
    {
        get { return _query.Expression; }
    }

    IQueryProvider IQueryable.Provider
    {
        get { return _query.Provider; }
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return _data.GetEnumerator();
    }

    IEnumerator<T> IEnumerable<T>.GetEnumerator()
    {
        return _data.GetEnumerator();
    }
}

GetDemoProduct:

Product GetDemoProduct()
{
    return new Product() { Id = 3, Name = "Name", Reviews = null };
}
恩科西

根据示例代码,没有代码路径会导致被测方法返回null

它会返回aNotFoundResult或aOkNegotiatedContentResult<Product>

假设被测方法有可能返回a NotFoundResult,如果满足if (product == null || product.Count() == 0)条件且该方法确实返回了未找到结果,则测试中的以下内容

...as OkNegotiatedContentResult<Product>;

尝试将其强制转换NotFoundResultOkNegotiatedContentResult<Product>将导致结果为null

您应该重新检查自己的设置/配置,TestModelContext因为您的linq调用导致product变量变为null,进而导致NotFoundResult返回。

更新:

Ok能够根据您更新的详细信息开始对其进行测试,并发现了我应该早已注意到的问题。

首先,将假冒产品添加到列表时,我不得不报错,并且不得不更新TestDbSet基类以包括添加的实体。我假设它在示例代码中被省略了。

public override T Add(T entity) {
    _data.Add(entity);
    return entity;
}

接下来在被测方法中,给定名称方法和测试中的期望值,它应该返回单个产品。您正在返回查询,当您在测试中进行转换时,该查询也将导致null。

public IHttpActionResult GetProduct(int id) {
    var product = (from t in db.Products.Include(t => t.Reviews)
                          .Where(t => t.Id == id)
                   select t);

    if (product == null || product.Count() == 0) {
        return NotFound();
    }

    return Ok(product.First());
}

进行上述两个更改后,测试按预期通过。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

单元测试 web api

来自分类Dev

Web API全局设置代码,也用于单元测试

来自分类Dev

删除Web API中的项目单元测试

来自分类Dev

单元测试Web Api 2模拟用户

来自分类Dev

Web API单元测试的模拟请求对象

来自分类Dev

使用xUnit Web API单元测试Get()方法

来自分类Dev

Web API控制器单元测试

来自分类Dev

单元测试-控制器未从ASP.NET Core Web API项目中的模拟IConfiguration中获取值

来自分类Dev

Web Worker的单元测试代码

来自分类Dev

在Visual Studio 2013中使用HttpClient进行单元测试/集成测试Web API

来自分类Dev

在Visual Studio 2013中使用HttpClient进行单元测试/集成测试Web API

来自分类Dev

返回IHttpActionResult时,如何对Web API操作方法进行单元测试?

来自分类Dev

在VS 2013中使用HttpClient代理类对Web API进行单元测试

来自分类Dev

ASP.NET Web API路由单元测试-未检测到控制器动作

来自分类Dev

如何对带有令牌的帖子(web-api)调用进行单元测试?

来自分类Dev

没有任何注入依赖性的Web API方法的单元测试

来自分类Dev

无法在C#WEB API REST服务单元测试中模拟Owin上下文

来自分类Dev

C#Web API中的最小起订量单元测试

来自分类Dev

如何在Web API中对冲突响应的错误消息进行单元测试

来自分类Dev

如何使用XUnit对Web API控制器进行单元测试

来自分类Dev

单元测试.NET Core 3 Web API控制器

来自分类Dev

在单元测试.NET Core Web API中检查ModelState内容

来自分类Dev

数据库功能Mock在C#Web API单元测试中不起作用

来自分类Dev

没有任何注入依赖性的Web API方法的单元测试

来自分类Dev

使用已登录的Web用户进行Yii单元测试

来自分类Dev

如何使用Linq单元测试Web服务

来自分类Dev

在Angular单元测试中模拟异步Web服务

来自分类Dev

如何使用Linq单元测试Web服务

来自分类Dev

Python Eve Web服务的单元测试用例

Related 相关文章

  1. 1

    单元测试 web api

  2. 2

    Web API全局设置代码,也用于单元测试

  3. 3

    删除Web API中的项目单元测试

  4. 4

    单元测试Web Api 2模拟用户

  5. 5

    Web API单元测试的模拟请求对象

  6. 6

    使用xUnit Web API单元测试Get()方法

  7. 7

    Web API控制器单元测试

  8. 8

    单元测试-控制器未从ASP.NET Core Web API项目中的模拟IConfiguration中获取值

  9. 9

    Web Worker的单元测试代码

  10. 10

    在Visual Studio 2013中使用HttpClient进行单元测试/集成测试Web API

  11. 11

    在Visual Studio 2013中使用HttpClient进行单元测试/集成测试Web API

  12. 12

    返回IHttpActionResult时,如何对Web API操作方法进行单元测试?

  13. 13

    在VS 2013中使用HttpClient代理类对Web API进行单元测试

  14. 14

    ASP.NET Web API路由单元测试-未检测到控制器动作

  15. 15

    如何对带有令牌的帖子(web-api)调用进行单元测试?

  16. 16

    没有任何注入依赖性的Web API方法的单元测试

  17. 17

    无法在C#WEB API REST服务单元测试中模拟Owin上下文

  18. 18

    C#Web API中的最小起订量单元测试

  19. 19

    如何在Web API中对冲突响应的错误消息进行单元测试

  20. 20

    如何使用XUnit对Web API控制器进行单元测试

  21. 21

    单元测试.NET Core 3 Web API控制器

  22. 22

    在单元测试.NET Core Web API中检查ModelState内容

  23. 23

    数据库功能Mock在C#Web API单元测试中不起作用

  24. 24

    没有任何注入依赖性的Web API方法的单元测试

  25. 25

    使用已登录的Web用户进行Yii单元测试

  26. 26

    如何使用Linq单元测试Web服务

  27. 27

    在Angular单元测试中模拟异步Web服务

  28. 28

    如何使用Linq单元测试Web服务

  29. 29

    Python Eve Web服务的单元测试用例

热门标签

归档