2009-06-12 2 views
1

Я использую библиотеку Moq. Я издеваюсь над экземпляром, который выполняет все обычные функции CRUD. Я хотел бы настроить его таким образом, чтобы разрешить только один вызов Delete (x) над некоторым объектом, и все последовательные вызовы Delete (x) того же объекта должны возвращать исключение.Как настроить mock-объект для возврата одного результата при первом вызове и Исключение для остальных

Метод 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

Ожидание теперь устарело, и вместо этого следует использовать «Setup». Но не существует метода/свойств Times, которые я мог бы назвать ... :( –