C# 如何验证Moq中没有调用该方法?

C# 如何验证Moq中没有调用该方法?,c#,.net,moq,C#,.net,Moq,如何验证未调用该方法 它是否有类似AssertWasNotCalled的内容 更新:从3.0版开始,可以使用新语法: mock.Verify(foo => foo.Execute("ping"), Times.Never()); 使用.AtMostOnce() 在实际测试之后,再次调用该方法。如果它抛出异常,则会调用它。更新:从第3版开始,检查上面问题的更新或下面Dann的答案 或者,将mock设置为strict,以便在调用没有expect的方法时失败 new Mock<IMoq&

如何验证未调用该方法

它是否有类似AssertWasNotCalled的内容

更新:从3.0版开始,可以使用新语法:

mock.Verify(foo => foo.Execute("ping"), Times.Never());
使用.AtMostOnce()


在实际测试之后,再次调用该方法。如果它抛出异常,则会调用它。

更新:从第3版开始,检查上面问题的更新或下面Dann的答案

或者,将mock设置为strict,以便在调用没有expect的方法时失败

new Mock<IMoq>(MockBehavior.Strict)
newmock(MockBehavior.Strict)
或者,如果您希望您的模拟是松散的,请使用.Throws(异常)

var m=newmock(MockBehavior.Loose);
m、 Expect(a=>a.moo()).Throws(新异常(“不应该被调用”);
这在最新版本的Moq中不起作用(因为至少3.1),应在中提到的
验证
方法中指定
回答

实际上,最好在Returns语句之后指定
.AtMost(0)

var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);
var m=new Mock();
m、 Expect(x=>x.probled()).Returns(“foo”).AtMost(0);
虽然“throws”也可以使用,但AtMost(0)
更具表现力。

来自:

你可能想测试的一件事是,支付方法 当一个65岁以上的人被送进医院时,不会接到电话 方法

[测试]
公共无效超过65岁的人不支付养老金供款(){
var mockPensionService=new Mock();
var人员=新人员(“测试”,66);
var calc=新的养老金计算器(mockPensionService.Object);
计算养老金分配(人);
mockPensionService.Verify(ps=>ps.Pay(It.IsAny()),Times.Never);
}

在测试后运行验证,该验证设置了
次。从不
枚举。e、 g

_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(), Times.Never);

假设您有这个方法,并且您想测试它是否没有被调用

//Setup    
var databaseSessionMock = new Mock<IDatabaseSession>();
databaseSessionMock.Setup(m => m.Commit()).Returns(true).Verifiable();
RepositoryFactory.Configure<IDatabaseSession>(databaseSessionMock.Object);

断言异常是由模拟框架引发的,这不是有点太模糊了吗?为什么?只需检查异常的类型。如果是我的最小起订量,你是安全的。使用验证时间。从来都不是一个更好的选择。。。我同意alex的观点,这个解决方案是可行的,但肯定是模糊的。。。。或者Callback()来设置一些可以断言的标志。另外,使用选项#2,您不能在常规的拆卸方法中使用VerifyAll,因为如果说未达到预期,则会失败;当测试理想情况下应该通过时。这不是真正的“未调用验证”,因为它可以在方法中捕获,并且仍然可以工作-提供假阳性!Expect现在不受欢迎这可能是2009年最好的方式,但现在肯定不是。Sorry这里最关键的是Verify(action,Never)调用在调用mock之后。我认为它是在为稍后调用VerifyAll()设置验证(这不起作用)简单而有效。谢谢。不确定这是否是因为更新的版本,但是如果您使用“MockBehavior.Strict”设置mock,并且不添加设置,那么如果调用该方法,它将失败。不需要验证。
_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(), Times.Never);
//Setup    
var databaseSessionMock = new Mock<IDatabaseSession>();
databaseSessionMock.Setup(m => m.Commit()).Returns(true).Verifiable();
RepositoryFactory.Configure<IDatabaseSession>(databaseSessionMock.Object);
databaseSessionMock.Verify(m => m.Commit(It.IsAny()), Times.Never(), "Database Session mock object was not used");