Как настроить макет объекта для возврата одного результата при первом вызове и исключения для остальных - PullRequest
1 голос
/ 12 июня 2009

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

Мой метод Delete () возвращает void.

Как мне это сделать?

Какой-то код

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

Ответы [ 2 ]

4 голосов
/ 12 июня 2009

Пусть код говорит: -)

    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 голосов
/ 12 июня 2009

вы не можете сделать что-то вроде (точный синтаксис может быть выключен из памяти):

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