如何测试API控制器与异步函数

本文关键字:控制器 异步 函数 API 何测试 测试 | 更新日期: 2023-09-27 18:02:08

我试图使用MSTest对我的API控制器进行单元测试。我遵循这里提到的教程:https://www.asp.net/web-api/overview/testing-and-debugging/mocking-entity-framework-when-unit-testing-aspnet-web-api-2

遗憾的是,上面的教程没有介绍如何调整以使控制器中的异步函数工作。

在下面的代码中,如果我在非异步控制器操作上运行测试,则测试将成功运行。但是当我在async函数上测试它时,它给了我一个错误。

public async Task GetService_ShouldReturnCorrectServiceId()
{
    //Arrange
    var context = new TestContext();
    context.Services.Add(new Service { Service_ID = 1, Service_Name = "WEBAPPS"});
    //Act
    var controller = new ServicesController(context);
    var result = await controller.GetServiceId("WEBAPPS") as OkNegotiatedContentResult<Service>;
    //Assert
    Assert.IsNotNull(result);
    Assert.AreEqual(1, result.Content.Service_ID);
    }

测试失败,给出如下错误:

源可查询项的提供者没有实现idbasyncqueryprovider

我的控制器方法是:
public async Task<IHttpActionResult> GetServiceId(string name)
{
    var service_id = await db.Services
                    .Where(s => (s.Service_Name == name))
                    .FirstOrDefaultAsync();
    if (service_id == null)
    {
         return NotFound();
    }
    return Ok(service_id);
}
TestContext文件是:
class TestContext : IContext
{
    public TestContext ()
    {
        this.Services = new TestServiceDbSet();
    }
    public DbSet<Service> Services { get; set; }
    public void Dispose() { }
}

我已经按照上面链接的所有步骤做了。我认为TestDbSet代码(见链接)必须更新,以考虑异步方法,但我不确定如何。

感谢您的帮助!谢谢。

如何测试API控制器与异步函数

您将需要实现一个aync QueryProvider。请查看本文中使用异步查询进行测试。