2016-06-23 2 views
0

MVCコントローラ機能にNunitとFakeItEasyを使用しています。ヘルパー機能を偽装しようとすると問題になる

私のテストコード:

[Test] 
     public async Task Search_Success() 
     { 
      if (!isFakeInitialized) 
       InitializeFake(); 

      url = "/N/UserSvc/v1/Types?skip=0&take=" + Constants.MaxSearchRowNumber; 
      Types= A.CollectionOfFake<Type>(3); 
      List<Type> found=new List<Type>(Types); 
      A.CallTo(() => nFake.GetDataAsync<IEnumerable<Type>>(fakeHttpSession, url)).Returns(Types); 
      var fakeHelper = A.Fake<helperFunctions>(); 
      A.CallTo(() => FakeHelper.GetAvailableTypes(fakeHttpSession, found, true)).Returns(foundTypes); 
      //Act 
      var actionResult = await myController.SearchView(); 
      var viewResult = actionResult as ViewResult; 

      //Assert 
      Assert.IsNotNull(viewResult); 
      Assert.AreEqual("Search", viewResult.ViewName); 
     } 

私は

A.CallTo(() => nFakeHelper.GetAvailableTypes(fakeHttpSession, found, true)).Returns(foundTypes); 

エラーでエラーを取得しています:が、それはデリゲート型ではないので、ラムダ式がオブジェクト型に変換することはできません。ここで

は、ヘルパー関数のコードです:

公共リストGetAvailableTypes(セッションセッション、リストallTypes、ブール値includeAllType) { 一覧結果=新しいリスト(); 結果を返します。 }

どうすればエラーを解決できますか。

答えて

0

他に何もない場合は、GetAvailableLicenseTypesvirtualではないため、A.CallToが失敗するはずです。私は少しでもエラーメッセージに驚いています。 は、私はあなたが、完全な誤りで始まるスタックを含め、より多くの情報を含めることができています再現してみましたが、かなり物事をダウントリム、コードの欠落を埋めるために持っていた、と

The current proxy generator can not intercept the specified method for the following reason: 
    - Non virtual methods can not be intercepted. 

を取得し終わってきましたトレース?

0

var nmsFakeHelper = A.Fake<NMCHelperFunctions>(); A.CallTo(() => nmsFakeHelper.GetAvailableLicenseTypes(fakeHttpSession, foundLicense, true)).Returns(foundLicensTypes);

この2行はあなたの問題です。

最初の行は、具体的な型NMCHelperFunctionsの偽装としてnmsFakeHelperを宣言しています。

2番目の行は、GetAvailableLicenseTypesメソッドが呼び出されたときの偽の動作を定義します。

FakeItEasyはバックグラウンドで、どのようなタイプの偽装(模擬、スタブなど)を決定します。あなたが偽造を求めているタイプが具体的なら、あなたはスタブを手に入れます。ただし、振る舞いを定義したり(戻り値を定義したり、メソッドが呼び出されたことを検証するなど)、スタブの代わりにモックが必要な場合は、

FakeItEasyがスタブの代わりにモックを返すようにするには、代わりにインターフェイスタイプを指定する必要があります。これは、モックがメソッド呼び出しをインターセプトできる必要があるためですが、.NETでは、メソッドは仮想呼び出しの場合にのみインターセプトできます。これは、使用しているタイプがインタフェースである場合に発生しますが、使用しているタイプが具体的なタイプである場合は発生しません。

この問題を回避するには、(少なくとも)GetAvailableLicenseTypesメソッド(その他の方法も含む)を含むNMCHelperFunctionsタイプへのインターフェイスを追加する必要があります。 var nmsFakeHelper = A.Fake<iNMCHelperFunctions>(); あなたの二行は変わらないだろうし、あなたのテストコードが動作するようになりました:

は、これはあなたの最初の行は、以下の(あなたのインターフェイスiNMCHelperFunctionsに名前を付けると仮定した場合)に変更することを意味します。

具体的な種類の代わりにインターフェイスの種類を使用するように、アプリケーションコードをリファクタリングする必要があります。これは、コンポーネントをスワップ可能にすることで、同じインターフェイスに準拠した新しいクラスを作成し、それに切り替えることで、今後の動作の追加や変更が容易になるため、いくつかの利点があります。

関連する問題