首页 > 解决方案 > Inspec 中的模拟对象

问题描述

Inspec 中有模拟对象的概念吗?我想模拟一个 REST API,因为提供此 API 的服务器在我的构建管道中不可用。

标签: chef-infrainspec

解决方案


InSpec 构建在 RSpec 之上,RSpec是 Ruby 中流行的测试库。幸运的是,RSpec 支持多种形式的模拟,包括模拟和存根

如果您有一些包含此 REST API 功能的中间类,假设您调用它ServiceGateway,那么您可以在 InSpec 测试中使用 RSpec 模拟该服务,double如下所示:

gateway = double('ServiceGateway')
expect(gateway).to receive(:get_data).and_return({ data: [1,2,3] })

# instantiate class under test providing the double to execute the rest of the test.

您应该始终检查您使用的 InSpec 版本取决于哪个版本的 RSpec。您可以通过查看您的Gemfile.lock文件或 RubyGems.org 的传递视图来执行此操作。例如,InSpec通过gem传递4.18.104依赖于 RSpec3.9.0inspec-core

最后一个想法,如果您计划与 REST API 进行交互,并且想要更真实地表示它们返回的内容以进行更“端到端”的风格测试(InSpec 最终是这样),请考虑引入vcrgem。这个 gem 执行 API 的记录/回放,第一次进行真正的调用,并在后续测试中使用保存的结果。它有时会给你一种错误的安全感(它会错过 API 更改),但它确实提供了完整的端到端体验。


推荐阅读