ruby - 有什么方法可以验证模拟或 stub 是否有效?

标签 ruby unit-testing tdd mocking

假设我有一个用以下代码定义的类和方法

class Book
  def quick_info
    return title + " " + author
  end
end

如果我正在为某个使用此 Book 类的 other 类编写单元测试,我会为 Book 的方法调用创建一个 stub 。快速信息

现在我认为,如果我的 Book 类发生变化,例如,如果 quick_info 方法重命名为 short_description,就会出现问题。我的单元测试仍将使用 quick_info,看起来我的测试通过得很好,但实际上它应该失败。

我想知道是否可以运行一些东西来验证我测试中的 stub /模拟是否确实由正确的类和方法组成。也许像这样的东西可以在持续集成服务器上运行,只是为了验证事情是否匹配?

嗯……现在我突然想到一个想法。甚至可以创建一个不存在的模拟/ stub 方法吗?如果不是,那么整个问题都没有实际意义。

编辑:

我刚刚使用 rspec 2 对此进行了尝试,我知道我可以创建一个 Book 实例并创建一个名为 i_dont_exist 的方法,我可以很好地调用它。所以我的问题仍然存在。有没有办法验证我的模拟/ stub 与真实存在的类/对象相匹配?

最佳答案

Mocha 对此有一个选项:

Mocha::Configuration.prevent(:stubbing_non_existent_method)

尽管它要求您模拟现有对象。 如果您从“scratch”创建模拟,它将无法工作(因为它不知道应该有什么方法)。

就最佳实践而言,恕我直言,您从错误的方向看待它。 您还应该对 Book 类进行单元测试,因此在重命名该方法时会出现测试失败。这应该是足够强大的信号来“grep”代码以查看是否有更多调用此方法。

另外(除非这只是一个例子)你为什么要模拟 Book?它只是一个数据 - 您通常希望模拟外部服务等,并在测试中使用真实数据对象。

关于ruby - 有什么方法可以验证模拟或 stub 是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5261594/

相关文章:

spring - 如何使用 Spring 从 XML 配置为单元测试创​​建 JNDI?

java - Android 中@SmallTest、@MediumTest 和@LargeTest 注解的用途是什么?

c++ - 如何编译和链接单元测试?

ruby - Savon :Module 的未定义方法 `configure'

Ruby SHA1 标志返回与 OpenSSL 标志不同的结果

java - 如何使用 Mockito 和 Java 在方法中传递模拟参数

python - Codewars Python TDD 离线

.net - 如何设计可测试性代码

java - 支持 vector 机/K 最近邻代码示例

ruby-on-rails - 如何在工厂女孩中分配哈希值?