我可以在Rhino-Mocks 3.6中使用AAA语法测试方法调用顺序吗?
在 Rhino-mocks 3.6 中,是否可以使用 AAA 语法测试以下示例:如果 Method1 调用第一个,然后 Method2 调用之后,然后调用 Method3 ?
// Assert
var mock = MockRepository.GenerateMock<ISomeService>();
// Act
myObject.Service = mock;
// How should I change this part to ensure that Rhino Mocks check the call order as well?
mock.AssertWasCalled(m=>m.Method1());
mock.AssertWasCalled(m=>m.Method2());
mock.AssertWasCalled(m=>m.Method3());
Is it possible to test for the following example if the Method1 called 1st, then Method2 called after and then Method3 by using the AAA syntax, in Rhino-mocks 3.6 ?
// Assert
var mock = MockRepository.GenerateMock<ISomeService>();
// Act
myObject.Service = mock;
// How should I change this part to ensure that Rhino Mocks check the call order as well?
mock.AssertWasCalled(m=>m.Method1());
mock.AssertWasCalled(m=>m.Method2());
mock.AssertWasCalled(m=>m.Method3());
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这是一种方法......
Here's one way to do it...
你可以,但你真的不应该。您应该专注于测试外部可观察的行为,而不是实现。
方法调用顺序可以更改,而不会影响与 API 客户端的契约。在这种情况下,您的测试将会失败,即使它不应该失败。
简而言之,测试实施会导致测试变得脆弱。脆性测试导致放弃测试。你不想去那里。
希望这有帮助。
You can, but you really shouldn't. You should focus on testing the externall observable behaviors, rather than the implementation.
Method call order can change without affecting the contract with the client of the API. In that case, your test will fail, even when it shouldn't.
In short, testing implementation leads to brittle tests. Brittle tests lead to abandonment of the tests. You don't want to go there.
Hope this helps.
以下是如何做得很好。
从这篇博客文章中找到了答案:使用 Rhino Mocks 3.5 验证方法执行的顺序 作者:Philip Japikse
Here is how to do it nicely.
Found the answer from this blog post: Verifying the Order Of Method Execution With Rhino Mocks 3.5 by Philip Japikse
以下是如何通过在每个方法调用中构建断言来实现这一点。
由于这是通过在中间运行断言来混合正常的排列-行为-断言模式,因此我喜欢为这些实例包含非常具体的错误消息,以便更轻松地识别测试失败。
您还可以通过在执行步骤期间将每次调用的结果保存在变量中,然后在断言步骤期间检查变量状态来获得类似的结果。这更好地保留了排列-行为-断言模式的划分,但需要编写和维护更多的管道代码。
Here's how to do it by building assertions into each method invocation.
Since this is mixes up normal arrange-act-assert pattern by running assertions in mid-act, I like to include very specific error messages for these instances to identify test failures more easily.
You could also achieve a similar result by saving the result of each invocation in a variable during the act step, and then checking the variable states during the assert step. This better preserves the division of the arrange-act-assert pattern, but it is more plumbing code to write and maintain.
@craastad 指定的 mocks.Ordered() 语法是正确的方法,但我无法让它在 RhinoMocks 3.5 中工作 - 相反,我必须调整它以在没有 @craastad 的解决方案使用的 MockRepository 实例的情况下工作调用 Ordered() :
如果你这样做,似乎也没有必要调用 fooMock.Replay() 。
The mocks.Ordered() syntax specified by @craastad is the right way to do it, but I couldn't get it to work in RhinoMocks 3.5 - instead I had to tweak it to work without the instance of MockRepository that @craastad's solution used to call Ordered() on:
If you do it this way, it also appears to be unnecessary to call fooMock.Replay() either.