2016-09-23 16 views
0

私の静的メソッドは以下のとおりです。問題は、私のコードがインタフェースを実装するオブジェクト/クラスを注入していないことですが、メソッドのパラメータとしてFuncを使用しています。どのようにMoqとそれを嘲笑する?パラメータとしてのFuncオブジェクトを持つときMoqをパラメータとしてFuncを持つユニットテストメソッドの使用方法

public class Repeater 
    { 
     const int NumberOfReapetsWithException = 5; 

     public static async Task<string> RunCommandWithException(Func<string, Task<string>> function, string parameter, 
      ILoggerService logger = null, string messageWhileException = "Exception while calling method for the {2} time", bool doRepeatCalls = false) 
     { 
      int counter = 0; 
      var result = ""; 

      for (; true;) 
      { 
       try 
       { 
        result = await function(parameter); 
        break; 
       } 
       catch (Exception e) 
       { 
        if (doRepeatCalls) 
        { 
         string message = HandleException<string, string>(parameter, null, logger, messageWhileException, ref counter, e); 

         if (counter > NumberOfReapetsWithException) 
         { 
          throw; 
         } 
        } 
        else 
        { 
         throw; 
        } 
       } 
      } 
      return result; 
     } 
... 
} } 
+4

何らかの理由でMoqを使用する必要がありますか?単体テスト内に独自のFuncオブジェクトを作成するだけで済みます。 –

+0

一般的に、私は開始された時間を数えたいと思っています。私は毎回増分することができるプロパティで新しいクラスを作成できることを知っています:)。しかし、私はMoq;を使用したい) –

+1

は、関数を作成し、Moqの必要がないことを使用します。関数内で呼び出された回数を数えることができます。サイドノート。デザインをリファクタリングする必要があります。リピータは、静的メソッドを使用する必要がないようにリファクタリングすることができます – Nkosi

答えて

2

あなたは単にたかったモックの挙動(部品番号を使用している場合は、オブジェクトを作成し、モックデリゲートとその動作を設定)に送信することができます。

[TestCase] // using nunit 
    public void sometest() 
    { 
     int i = 0; 
     Func<string, Task<string>> mockFunc = async s => 
     { 
      i++; // count stuff 
      await Task.Run(() => { Console.WriteLine("Awating stuff"); }); 
      return "Just return whatever"; 
     }; 
     var a = Repeater.RunCommandWithException(mockFunc, "mockString"); 

    }