我正在使用 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>();
...
让代码说话:-)
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);
}
你不能做类似的事情(确切的语法可能不记得了):
mock.Expect(m => m.Delete(1)).Times.Exactly(1);