通常、実行中のテストごとにデータベースをクリーンアップする必要があります。Ruby でこれを行うために DatabaseCleaner gem を使用しています。基本的に、スイート全体を実行する前に、データベースを完全にクリーンアップします
DatabaseCleaner.clean_with :truncation
データベースによっては、これに時間がかかります。その後、トランザクション戦略を使用して高速に保ちます
DatabaseCleaner.strategy = :transaction
これは、すべての仕様の前にデータベースでトランザクションが開始され (セーブポイントが作成され)、このトランザクションでテストが実行されることを意味します。テストが終了すると、ロールバックが発行され、次の仕様でデータベースが再びクリーンになります。https://github.com/bmabey/database_cleanerをご覧ください
ただし、同じ仕様でそのようなレコードを 2 つ作成する必要がある場合は、何らかのカウンターを作成する必要があります。何かのようなもの:
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 が変更された場合でも、これは引き続き有効です。分散システムの統合テストは一種の複雑な問題であり、基本的には、システムのすべての部分を元の状態にするシステム全体のトランザクションのようなものが必要になります。あなたはそのコントロールを持っていないので、私はただスタブします。