2017-09-26 181 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