2011-11-01 12 views
28

私はアプリケーションのテストを開発中です。パラメータとしてparams配列を持つメソッドがあります。私はMoqを使ってメソッドを設定しましたが、テストを実行すると、メソッドの戻り値はヌルです。つまり、モックされていません。ここでパラメータの設定方法

は、コードサンプルです:

public interface ITicketManager { 
    string GetFirstTicketInQueueIfMatches(params string[] ticketsToMatch); 
} 

public class TicketManager : ITicketManager { 
    private Queue<string> ticketQueue = new Queue<string>(); 

    public string GetFirstTicketInQueueIfMatches(params string[] ticketsToMatch) { 
     var firstQueuedTicket = ticketQueue.Peek(); 
     var firstQueuedTicketMatchesAnyOfRequested = ticketsToMatch.Any(t => t == firstQueuedTicket); 

     if(firstQueuedTicketMatchesAnyOfRequested) 
      return firstQueuedTicket; 

     return null; 
    } 
} 

モックコードは次のようになります。それは、モックメソッドを打つことはありませんなぜ

var mock = new Mock<ITicketManager>(); 

mock.Setup(m => m.GetFirstTicketInQueueIfMatches(It.IsAny<string>())) 
    .Returns(p => { 
    if(p.Contains("A")) 
      return "A"; 

    return null; 
}); 

答えて

50

配列ではなく、単一の文字列を取得するメソッドを呼び出そうとしています。 params部分を扱うのはC#コンパイラで、個々の値を指定する呼び出しコードを配列に渡す呼び出しに変換することに注意してください。メソッドそのものに関する限り、配列を取得するだけです。それがあなたが嘲笑していることです。

コンパイラは実際あるにあなたのコードを回す:あなたが望むものではありませんどの

mock.Setup(m => m.GetFirstTicketInQueueIfMatches 
         (new string[] { It.IsAny<string>() })) 

あなたが使用する必要があります。

mock.Setup(m => m.GetFirstTicketInQueueIfMatches(It.IsAny<string[]>())) 

あなたはそれが唯一の単一の値を与えますことを確認する必要がある場合は

が、あなたは非のparamsパラメータの場合と同じようにそれを行う必要があります。

paramsは、基本的にC#コンパイラとの違いです。moqではありません。

+0

@DiegoACによって一致する必要があると考えている:まあとにかく 'null'なのでを返す*条件付き*それを持っています。 '' p 'に '' A' 'が含まれていない場合、代わりに" Foo "を返そうとしましたか?あなたは少なくともそれが呼び出されているのを見ていただろう... –

+0

優秀な答えジョン。ありがとう。実際、私はただ一つの文字列しか受け取っていませんでした。コンパイラについての説明は非常に便利でした。 –

9

私はparams stringIt.IsAny<string[]>()はなくIt.IsAny<string>()

関連する問題