2016-08-31 8 views
1

他のメソッドを呼び出すメソッドをテストしています。私は私の嘲笑接続オブジェクトを生成するには、このメソッドを使用して作業テストを持っている:凝縮コード:連続した呼び出しで異なる値を返すSetupSequence

private Mock<IDatabaseConnection> MockOutGetControlDocInfoData() 
    { 
     Mock<IDatabaseConnection> mockConn = new Mock<IDatabaseConnection>(); 
     List<Mock<IDbCommand>> mockCmds = new List<Mock<IDbCommand>>(); 
     List<long> vals = new List<long>() { 2, 2, 2, 2, 10, 2, 2, 2, 2, 2 }; 
     foreach (long val in vals) 
     { 
      mockCmds.Add(CreateMockCmdObjectWithReturnValue(val)); 
     } 
     mockConn.SetupAllProperties(); 
     mockConn.Setup(c => c.Conn.ConnectionString).Returns("What the heck."); 
     mockConn.SetupSequence(c => c.CreateCommand(It.IsAny<string>())) 
      .Returns(mockCmds[0].Object) 
      .Returns(mockCmds[1].Object) 
      .Returns(mockCmds[2].Object) 
      .Returns(mockCmds[3].Object) 
      .Returns(mockCmds[4].Object) 
      .Returns(mockCmds[5].Object) 
      .Returns(mockCmds[6].Object) 
      .Returns(mockCmds[7].Object) 
      .Returns(mockCmds[8].Object) 
      .Returns(mockCmds[9].Object); 
     return mockConn; 
    } 

は、私はそれがループの一部であるべきように思われる、SetupSequence戻り値に満足してないんだけど、私はしないでくださいSetupSequenceに複数のReturnを配置する方法を理解しています。改善のための任意のアイデア?

少なくとも今のところ、テスト値のリストを手動で作成しても問題ありません。

これは関連するものではありませんが、必要に応じてCreateMockCmdObjectWithReturnValueコードを提供することができます。

答えて

3
var sequence = mockConn.SetupSequence(c => c.CreateCommand(It.IsAny<string>())); 
foreach (var cmd in mockCmds) 
{ 
    sequence = sequence.Returns(cmd.Object); 
} 
+0

これはLinqですか?私のコードに入れてもビルドされません。 Long配列は 'Select'メソッドを持たないようです。 –

+0

申し訳ありませんが、私のコードを更新しました –

+0

ありがとう!これは完全に機能します。キーは 'sequence'変数を取得していました。 –

関連する問題