2

いくつかのアプリケーションで使用される API ラッパーの宝石を書いています。私はこの API を制御できませんが、本番環境に影響を与えずに台無しにできる開発環境があります。

この宝石のテストをどのように書きますか?

例: メソッド add_customer を考えてみましょう。このメソッドはいくつかのパラメーター (名前、メールなど) を取り、メールは一意です。

電子メールa@gmail.comで顧客を挿入するテストを書くとします。2 回目は、gem は正常に動作していますが、このテストは失敗します。

4

1 に答える 1

0

通常、実行中のテストごとにデータベースをクリーンアップする必要があります。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 が変更された場合でも、これは引き続き有効です。分散システムの統合テストは一種の複雑な問題であり、基本的には、システムのすべての部分を元の状態にするシステム全体のトランザクションのようなものが必要になります。あなたはそのコントロールを持っていないので、私はただスタブします。

于 2012-05-25T17:58:13.243 に答える