当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何验证在Moq中没有调用该方法?》经验,为你挑选了4个好方法。

如何验证在Moq中未调用该方法?

它有像AssertWasNotCalled这样的东西吗?

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

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

Dann.. 507

在具有Times.Never枚举集的测试之后运行验证.例如

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

这里的关键是在调用mock之后,Verify(action,Never)调用是*.我以为它是为稍后调用VerifyAll()设置验证(*不*工作) (3认同)


Dan Fish.. 146

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

或者,使你的模拟严格,如果你调用一个你没有期望的方法,它将失败

new Mock(MockBehavior.Strict)

或者,如果您希望模拟松动,请使用.Throws(例外)

var m = new Mock(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));

这不是真正的"验证未被调用",因为它可以在方法中被捕获并且仍然可以工作 - 提供误报! (46认同)

...或Callback()设置一些可以断言的标志. (8认同)

Expect现已弃用 (4认同)

这可能是2009年最好的方式,但现在肯定不是.抱歉 (4认同)

同样使用选项#2,您不能在常规拆解方法中使用VerifyAll - 它将无法表示未满足期望; 当测试理想地通过时. (2认同)


Chris Marisi.. 41

被盗:约翰福斯特回答问题,"需要帮助更好地了解Moq"

您可能想要测试的一件事是,当65岁以上的人被传入方法时,不会调用pay方法

[Test]
public void Someone_over_65_does_not_pay_a_pension_contribution() {

    var mockPensionService = new Mock();

    var person = new Person("test", 66);

    var calc = new PensionCalculator(mockPensionService.Object);

    calc.PayPensionContribution(person);

    mockPensionService.Verify(ps => ps.Pay(It.IsAny()), Times.Never());
}


miha.. 9

这在Moq的最新版本中不起作用(因为至少3.1),它应该Verify在答案中提到的方法中指定.

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

var m = new Mock();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);

虽然"投掷"也有效,但AtMost(0)恕我直言更具表现力.



1> Dann..:

在具有Times.Never枚举集的测试之后运行验证.例如

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


这里的关键是在调用mock之后,Verify(action,Never)调用是*.我以为它是为稍后调用VerifyAll()设置验证(*不*工作)

2> Dan Fish..:

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

或者,使你的模拟严格,如果你调用一个你没有期望的方法,它将失败

new Mock(MockBehavior.Strict)

或者,如果您希望模拟松动,请使用.Throws(例外)

var m = new Mock(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));


这不是真正的"验证未被调用",因为它可以在方法中被捕获并且仍然可以工作 - 提供误报!
...或Callback()设置一些可以断言的标志.
Expect现已弃用
这可能是2009年最好的方式,但现在肯定不是.抱歉
同样使用选项#2,您不能在常规拆解方法中使用VerifyAll - 它将无法表示未满足期望; 当测试理想地通过时.

3> Chris Marisi..:

被盗:约翰福斯特回答问题,"需要帮助更好地了解Moq"

您可能想要测试的一件事是,当65岁以上的人被传入方法时,不会调用pay方法

[Test]
public void Someone_over_65_does_not_pay_a_pension_contribution() {

    var mockPensionService = new Mock();

    var person = new Person("test", 66);

    var calc = new PensionCalculator(mockPensionService.Object);

    calc.PayPensionContribution(person);

    mockPensionService.Verify(ps => ps.Pay(It.IsAny()), Times.Never());
}



4> miha..:

这在Moq的最新版本中不起作用(因为至少3.1),它应该Verify在答案中提到的方法中指定.

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

var m = new Mock();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);

虽然"投掷"也有效,但AtMost(0)恕我直言更具表现力.


在Moq v3.1中找不到这个
推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有