2016-08-12 68 views
1

我想單元測試我的API控制器使用MSTest。我正在關注這裏提到的教程:https://www.asp.net/web-api/overview/testing-and-debugging/mocking-entity-framework-when-unit-testing-aspnet-web-api-2如何使用異步函數測試API控制器?

上面的教程很遺憾沒有涵蓋使控制器中的異步函數工作的調整。

在下面的代碼中,如果我在非異步控制器操作上運行它,測試會成功運行。但是當我在異步函數上測試它時,它給了我一個錯誤。

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

測試失敗給這個錯誤:

the provider for the source iqueryable doesn't implement 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代碼(請參閱該鏈接)必須更新以解釋異步方法,但我不知道如何。

感謝任何幫助!謝謝。

+0

它是您的「TestServiceDbSet」類型的實現。有兩種可能的方式來實現它,第一種方式不適用於'async'代碼,只有第二種方法可以。不幸的是,你鏈接到的例子沒有提到這一點。請參閱[使用您自己的測試雙打進行測試](https://msdn.microsoft.com/zh-cn/data/dn314431.aspx)。我爲此寫了一些擴展,以便在整個測試項目中重用,請參閱[DbContext Data Mocking for Unit Testing](https://github.com/IgorWolbers/DbContextMockForUnitTests) – Igor

+0

@Igor謝謝!會看看。有沒有更簡單的方法來測試這個使用moq/nunit? – 90abyss

+0

測試裝具並不重要。就創造假貨而言,我更喜歡NSubstitute(可通過NuGet獲得),但我認爲這也不重要,它更偏向個人。儘管您的設計對測試能力影響最大。儘可能保持抽象/一般的控制器內的類型引用是確保測試非常簡單的最佳方法。當使用EF我使用引用類型的DbContext永不派生類型和使用Set ()來獲取DbSets ,那麼它很容易在控制器或服務注入假的DbContext與嘲笑集。 – Igor

回答

1

您將需要實現一個異步QueryProvider。請參閱this文章中的使用異步查詢進行測試。