如何使用异步函数测试API控制器?

时间:2016-08-12 19:09:24

标签: c# asp.net unit-testing mstest vs-unit-testing-framework

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

上面的教程遗憾地没有涵盖为使其适用于控制器中的异步功能而进行的调整。

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

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);
    }

测试未能发出此错误:

  源iqueryable的提供者没有实现   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代码(请参阅该链接)以说明异步方法,但我不确定如何。

感谢任何帮助!感谢。

1 个答案:

答案 0 :(得分:1)

您需要实现一个异步QueryProvider。在this文章中查看使用异步查询进行测试。