我正在为将用于多个应用程序的 API Wrapper 编写一个 gem。我无法控制这个 API,但我确实有一个开发环境,我可以在不影响生产的情况下搞砸。
您将如何为这个 gem 编写测试?
示例:考虑方法 add_customer,它采用多个参数(名称、电子邮件等),其中电子邮件是唯一的。
如果我编写了一个测试,该测试通过电子邮件 a@gmail.com 插入客户。第二次,尽管我的 gem 工作正常,但这个测试会失败。
通常,您希望为正在运行的每个测试清理数据库。我们正在使用 DatabaseCleaner gem 在 ruby 中执行此操作。基本上在我们运行整个套件之前,我们完全清理数据库
DatabaseCleaner.clean_with :truncation
这需要一些时间,具体取决于您的数据库。之后我们使用事务策略来保持它更快
DatabaseCleaner.strategy = :transaction
这意味着在每个规范之前,在 db 中启动一个事务(创建一个保存点),并且测试在这个事务中运行。测试完成后,发出回滚,下一个规范再次拥有一个干净的数据库。查看https://github.com/bmabey/database_cleaner
如果您确实需要在同一规范中创建两个这样的记录,那么您将需要创建某种计数器。就像是:
class Counter
def initialize
@count = 0
end
def email
@count += 1
"something_cool#{@count}@whatever.com"
end
end
然后使用这个计数器每次都给你一个独特的电子邮件。查看 FactoryGirl gem https://github.com/thoughtbot/factory_girl/wiki/Usage并查找序列可能是值得的。如果您正在构建一个小型 gem,那么您可能不想添加很多依赖项。祝你好运。一路TDD!
无法控制系统的所有部分会导致更大的问题。在单元测试中,您可以愉快地去除所有外部 API,只返回预期的结果。但当然,如果 API 发生变化,这仍然会通过。分布式系统的集成测试是一个复杂的问题,基本上你需要像系统范围的事务这样的东西,它将系统的所有部分都置于原始状态。既然你没有那个控制权,我就放弃了。