2009-06-12 5 views
1

私はMoqライブラリを使用しています。私は、すべての通常のCRUD機能を実行するインスタンスを試しています。私はいくつかのオブジェクト上のDelete(x)呼び出しを1つだけ許可し、同じオブジェクトのDelete(x)へのすべての連続呼び出しがExceptionを返すように設定したいと思います。最初の呼び出しで1つの結果を返すようにモックオブジェクトを設定する方法と残りのものを例外にする

My Delete()メソッドはvoidを返します。

どうすればよいですか?

mock = new Mock<ITest>(); 
mock.Setup(m => m.Delete(1)); 
mock.Setup(m => m.Delete(3)).Throws<Exception>(); 
... 

答えて

4

public interface ITest 
    { 
     void Delete(int x); 
    } 

    [TestMethod] 
    [ExpectedException(typeof(InvalidOperationException))] 
    public void TestMethod1() 
    { 
     HashSet<int> deleted = new HashSet<int>(); 

     var mock = new Mock<ITest>(); 
     mock.Setup(m => m.Delete(It.Is<int>(x => deleted.Contains(x)))) 
      .Throws(new InvalidOperationException("already deleted")); 
     mock.Setup(m => m.Delete(It.Is<int>(x => !deleted.Contains(x)))) 
      .Callback<int>(x => deleted.Add(x)); 

     mock.Object.Delete(1); 
     mock.Object.Delete(1); 
    } 
:-)コードの話をしてみましょう
+0

非常に素晴らしいトリックでした。 –

0

は、あなたのようなもの(正確な構文は、メモリからオフでもよい)で行うことはできませんいくつかのコード:

mock.Expect(m => m.Delete(1)).Times.Exactly(1); 
+1

Expectは現在廃止されており、代わりに "Setup"を使用する必要があります。しかし、私が呼び出すことができるTimesメソッド/プロパティはありません:( –

関連する問題