【问题标题】:RSpec: What are the alternatives to 'allow_any_instance_of'?RSpec:“allow_any_instance_of”的替代方案是什么?
【发布时间】:2016-01-13 00:10:50
【问题描述】:

the documentation Rspec Mocks 维护者中

...出于多种原因不鼓励使用它...

列出的原因似乎与此功能的expect 版本有关,但两者之间没有区别。

我知道为什么不鼓励使用expect 版本,但allow 版本似乎没有列出的问题。

似乎使用allow 版本是测试某些类型行为的最方便的方法。

示例:

我正在测试一些路由的授权。一种方法是在数据库中创建一个用户,但这似乎相当繁重,我更喜欢只创建一个模拟对象并在授权调用期间返回它。这个例子是一个测试代码的具体案例,它使用了复杂的库,单独测试。

鉴于不鼓励,有什么更好的选择?

【问题讨论】:

    标签: unit-testing rspec


    【解决方案1】:

    根据您发布的文档,不使用allow_any_instance_of 的原因是它过于笨拙,并且可以掩盖您可能会错过的潜在代码异味。话虽如此,我仍然使用它......他们肯定没有提供替代方案,所以如果您需要该功能并且已经考虑过其他选项或其他方式来编写您的测试并决定反对这些,那就使用它。

    【讨论】:

    • 我发现缺少文档,这就是我问这个问题的原因。特别是它没有区分allowexpect 变体,也没有提出替代方案。
    • 我相信文档的作者不鼓励使用这些方法的allowexpect 版本,尽管他们在示例中使用了expect。他们提供了一个使用Widget 的示例,如: ``` 结果存在一些语义上令人困惑的边缘情况。例如,在 expect_any_instance_of(Widget).to receive(:name).twice 中,不清楚一个特定的实例是否应该接收 name 两次,或者是否预期两个接收总数。 (是前者。) ``` 相反,尝试将协作者作为模拟传递并对其做出期望,而不是任何实例。
    • 不幸的是,我不相信 Rspec 中有任何替代方案,除了改变你编写测试的方式,这就是他们所提议的。 allowexpect 都非常广泛,可以掩盖您可能犯的其他错误。
    猜你喜欢
    • 2021-11-13
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 2017-06-11
    • 2018-04-16
    相关资源
    最近更新 更多