2016-06-15 6 views
2

指定されたオブジェクトを返すが、nullを返す単体テストがあります。NS代理返却オブジェクトが定義されているにもかかわらずAsyncがnullを返す

テストにデータプロバイダ:

public class PlanDataProvider : BaseDomainServiceProvider, IPlanDataProvider 
{ 
    //CTOR 
    public PlanDataProvider(IDataAccessTemplate template, IEntityStore entityStore) : base(template, entityStore) 
    { 
    } 

    public async Task<DefaultActionPlan> GetDefaultActionPlan(string referenceListId) 
    { 
     var objectId = GetObjectId(referenceListId); 

     var defaultActionPlan = await Template.InvokeAsync(context => Task.FromResult(EntityStore.GetEntityById<DefaultActionPlan, ObjectId> 
      (
       context.ActivityContext as IDataAccessContext, 
       typeof(DefaultActionPlan).FullName, 
       objectId 
      ))); 
    } 
} 

テスト:とにかくトンがnull eferytimeとテストトンのデバッグを返し

public async Task GetPlan_BadPlanID() 
{ 
    //Arrange 
    string badPlanId = "57509afbc6b48d3f33b2dfcd"; 

    ...snip... 

    DefaultActionPlan jj = new ObjectId(badPlanId); 

    //create EntityStore object 
    var dataxs = Substitute.For<IDataAccessContext>(); 
    var estore = Substitute.For<IEntityStore>(); 
    estore.GetEntityById<DefaultActionPlan, ObjectId>(
     dataxs, 
     typeof(DefaultActionPlan).FullName, 
     new ObjectId(badPlanId)) 
    .Returns(Task.FromResult(jj).Result); 

    var dataAccessTemplate = Substitute.For<IDataAccessTemplate>(); 

    PlanDataProvider pdp = new PlanDataProvider(dataAccessTemplate, estore); 

    //Act 
    var t = await pdp.GetDefaultActionPlan(badPlanId); 
    //Now this confuses me as the compiler thinks t is DefaultActionPlan NOT Task<DefaultActionPlan>??? 
} 

がnullではGetDefaultActionPlanので戻っていませんJJ代わりにnullを? ?

返されたjjは何ですか?


編集:

エリスとゲイブの両方が正しくIEntityStoreの私のモックは、それがリターンは、このようにラッピングInvokeAsyncに渡され取得することはできません指定していても...その値としては十分ではなかったことを指摘しましたInvokeAsyncも同様にモックする必要がありました。

Gabeさんの答えは、Arg.AnyがInvokeAsyncに必要なparmsを満たしていないため、わずかにオフになっていました。しかし、私は複数のプロジェクト(これは大きな会社です)に渡って継承チェーンを追跡する時間を費やしたので、私は彼のことを間違っていません。彼は何かにアクセスする権限がありません。ここで終わりで

に成功したコードは次のとおりです。私はあなたのコードでこれを見ませんが

var estore = Substitute.For<IEntityStore>(); 
var dataAccessTemplate = Substitute.For<IDataAccessTemplate>(); 
dataAccessTemplate.InvokeAsync(context => Task.FromResult(
     estore.GetEntityById<DefaultActionPlan>(
       dataxs, typeof(DefaultActionPlan).FullName, new ObjectId(badPlanId)))) 
.ReturnsForAnyArgs(jj); 

var pdp = new PlanDataProvider(dataAccessTemplate, estore); 
+0

'IDataAccessTemplate'はあなたのメソッドを決して定義しませんでした。 'await Template.InvokeAsync'は' InvokeAsync'の空のモックを呼び出すか、実際には引数を使ってメソッドを呼び出しますか? – Eris

答えて

3

、私はGetDefaultActionPlanがdefaultActionPlan変数を返すと仮定します、とTemplate.InvokeAsyncであることコンストラクタを介して渡されたIDataAccessTemplateを参照してください。

あなたはTemplate.InvokeAsyncのモック戻り値が欠落しているように見え、他の呼び出しラップしているので、その戻り値は、あなたが気に唯一のものです:あなたがのための代替を作成するとき

var estore = Substitute.For<IEntityStore>(); 
var dataAccessTemplate = Substitute.For<IDataAccessTemplate>(); 
dataAccessTemplate.InvokeAsync(context => Task.FromResult(Arg.Any<DefaultActionPlan>) 
    .ReturnsForAnyArgs(jj); 

var pdp = new PlanDataProvider(dataAccessTemplate, estore); 
+0

私はあなたが正しい道で私を持っていると信じていますが、InvokeAsyncラッパーをモックするためにいくつかのニュアンスを試しています...それはcontex => Task.FromResultが好きではないようです。もっと。 – GPGVM

+0

私の編集を参照してください。ありがとうございました! – GPGVM

+0

素晴らしい! InvokeAsyncモックコールを構築する方法と、Arg.Anyをテストするための簡単なコードを作成しました。 estore.GetEntityByIdはDefaultActionPlanオブジェクト以外のものを返しますか? –

関連する問題