2009-06-12 26 views
1

我正在使用Moq庫。我正在嘲笑一個執行所有常規CRUD功能的實例。我想設置它只允許一個Delete(x)調用通過某個對象,並且對同一對象的所有連續調用Delete(x)都應該返回一個Exception。如何設置模擬對象在第一次調用時返回一個結果,其餘爲

我的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

非常好的技巧在做。 – 2009-06-12 15:10:18

0

你不能這樣做(確切的語法可以從內存中關閉):

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

Expect現在已過時,應該使用「安裝程序」代替。但有沒有時間方法/財產,我可以打電話...... :( – 2009-06-12 14:51:29

相關問題