Ruby gem:为api包装器编写测试

时间:2012-05-25 16:32:55

标签: ruby testing gem

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

你会如何为这个宝石编写测试?

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

如果我编写的测试用电子邮件插入客户a@gmail.com。在第二次,虽然我的宝石正常工作,但这个测试将失败。

1 个答案:

答案 0 :(得分: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并查找序列可能是值得的。如果你正在构建一个小宝石,那么你可能不想添加很多依赖项。祝好运。 TDD一路走来!

无法控制系统的所有部分会导致更大的问题。在单元测试中,您可以愉快地删除所有外部API并返回预期结果。但当然,如果API发生变化,这仍然会通过。分布式系统的集成测试是一个复杂的问题,基本上你需要像系统范围的事务那样将系统的所有部分都置于原始状态。由于你没有这种控制,我只会把它拿走。