2017-09-26 15 views
1

ユニットテストでは、システムはUnitOfWorkManager.Current(null参照例外)を解決できません。 _unitOfWorkManagerはタイプ:IUnitOfWorkManagerであり、DIを介して注入される。以下のユニットテストで...ユニットテストでUnitOfWorkManager.Currentを擬似します

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

私は、次のWeb APIコードをテストしてい

[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'を初期化する方法は?これは、 'new VendorController'を介してではなく、' iocManager'を介してフェッチされます。 –

+0

これは次のようです: '_vendorController = Resolve ();' – Oakfire

+0

ユニットテストクラスは、 'Abp'インフラストラクチャから既存のクラスから継承されていますか? –

答えて

1

コントローラメソッドvirtualを作成してください。

参照:

  • (MVCコントローラとWeb APIコントローラーと同様に)自己注射したクラスのすべてのパブリック仮想メソッドを:UnitOfWork Attribute Restrictions

    あなたがUnitOfWorkの属性を使用することができます。

更新

テストで明示的に作業単位を開始した場合、合理的な解決である:

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

私は何も変わらないのではないかと思いますが、 "virtual"の有無にかかわらず同じnull参照例外が発生します。この方法は単体テストの外で正しく動作します。 – Oakfire

+0

妥当かどうかわかりませんが、問題を解決したようです。 :-)あなたの助けを借りてありがとう! – Oakfire