如何设置模拟对象以在第一次调用时返回一个结果,为其余调用返回Exception

时间:2009-06-12 14:43:46

标签: mocking moq

我正在使用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>();
...

2 个答案:

答案 0 :(得分: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);
    }

答案 1 :(得分:0)

你不能做类似的事情(确切的语法可能会从内存中删除):

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