2

我正在为将用于多个应用程序的 API Wrapper 编写一个 gem。我无法控制这个 API,但我确实有一个开发环境,我可以在不影响生产的情况下搞砸。

您将如何为这个 gem 编写测试?

示例:考虑方法 add_customer,它采用多个参数(名称、电子邮件等),其中电子邮件是唯一的。

如果我编写了一个测试,该测试通过电子邮件 a@gmail.com 插入客户。第二次,尽管我的 gem 工作正常,但这个测试会失败。

4

1 回答 1

0

通常,您希望为正在运行的每个测试清理数据库。我们正在使用 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 发生变化,这仍然会通过。分布式系统的集成测试是一个复杂的问题,基本上你需要像系统范围的事务这样的东西,它将系统的所有部分都置于原始状态。既然你没有那个控制权,我就放弃了。

于 2012-05-25T17:58:13.243 回答