2017-09-26 144 views
1

當單元測試時,系統無法解析UnitOfWorkManager.Current(null參考異常)。 _unitOfWorkManager的類型爲:IUnitOfWorkManager,並通過DI注入。單元測試中嘲笑UnitOfWorkManager.Current

我測試了以下Web API代碼:

[HttpPost] 
public async Task<IHttpActionResult> Subscription(SubscriptionInputDto model) 
{ 
    if (!await VendorHasAccess(model.OrganizationId)) 
     return StatusCode(HttpStatusCode.Forbidden); 

    var input = new Subscription 
    { 
     ... 
    }; 

    var data = await _subscriptionRepository.InsertAsync(input); 

    await _unitOfWorkManager.Current.SaveChangesAsync(); 

    return Ok(data.MapTo<SubscriptionDto>()); 
} 

...用下面的單元測試:

[Fact] 
public async Task Should_Create_New_Subscription() 
{ 
    //Arrange 
    var organization = await UsingDbContextAsync(async context => await context.VendorOrganizations.FirstOrDefaultAsync()); 
    var input = new SubscriptionInputDto { OrganizationId = organization.Id }; 

    //Act 
    var actionResult = await _vendorController.Subscription(input); 
    var response = actionResult as OkNegotiatedContentResult<SubscriptionDto>; 

    //Assert 
    Assert.NotNull(response); 
    Assert.Equal(organization.Id, response.Content.OrganizationId); 
} 

我想不通,或找到任何文件,如何解決UnitOfWorkManager.Current,以便在單元測試中不會失敗。 Web API代碼本身在生產中工作。

任何提示?

+0

你如何初始化'_vendorController'?它應該通過'iocManager'獲取,而不是通過'new VendorController'來獲取。 –

+0

是的,像這樣:'_vendorController = Resolve ();' – Oakfire

+0

您的單元測試類是否從'Abp'基礎設施的現有類繼承? –

回答

1

使您的控制器方法virtual

參見:UnitOfWork Attribute Restrictions

可以使用的UnitOfWork屬性爲:

  • 自我注射類中的所有公共虛擬方法(像MVC控制器和Web API控制器)。

更新

如果在開始工作的單位明確在您的測試是一個合理的解決方案:

using (var unitOfWork = Resolve<IUnitOfWorkManager>().Begin()) 
{ 
    // ... 
    unitOfWork.Complete(); 
} 
+0

恐怕沒有改變任何東西,在有或沒有「虛擬」的情況下發生相同的null參考異常。該方法在單元測試之外正常工作。 – Oakfire

+0

不確定是否合理,但似乎解決了這個問題。 :-)感謝您的幫助! – Oakfire