通常情况下, 您想要为您正在运行的每次测试清理您的 DB 。 我们正在使用 DatabaseCleaner 宝石在红宝石中做这个 。 基本上在我们运行整个套房之前, 我们用它来完全清理数据库 。
DatabaseCleaner.clean_with :truncation
这需要时间取决于您的 db 。 之后我们使用交易策略来保持速度更快
DatabaseCleaner.strategy = :transaction
这意味着在每次交易在 db( 创建了一个保存点) 和此交易中的测试运行开始之前, 交易将开始。 测试完成后, 将进行回放, 下一个显示将再次有一个干净的 db 。 请查看 < a href=" https:// github. com/ bmabey/ database_ cleaner" rel=“ nofollow > https://github. com/ bmabey/ database_ cleaner a >
如果你确实需要在同一规格下创建两个这样的记录,那么你就需要创建某种柜台。比如:
class Counter
def initialize
@count = 0
end
def email
@count += 1
"something_cool#{@count}@whatever.com"
end
end
然后用这个计数器给您每次发一个独特的电子邮件。 可能值得您检查工厂Girl宝石 < a href="https://github. com/ thoughtbot/factory_girl/ wiki/ Usage" rel = “ nofollow" >https://gitub. com/ thoughtbot/factory_girl/wiki/ Usage < / a > 并查找序列。 如果您正在建造小宝石, 那么您可能不想添加许多依赖关系 。 good Luck. TDD all the way!
没有系统所有部分的控制权将产生更大的问题。 在单位测试中, 您可以愉快地将所有外部API 都挤掉, 并只返回预期的结果 。 当然, 如果 API 更改的话, 这仍然会过去 。 分布式系统的整合测试是一个复杂的问题, 基本上, 您需要像系统内部的交易一样, 将系统的所有部分都放到原状态 。 由于您没有这种控制, 我将直接放弃它 。