四角形
ボブ:私のテストはとても長い!
スティーブ:なぜ彼らはそんなに長くかかりますか?
ボブ:私のレコードを作成し、データベースに保存する永遠にかかる!
スティーブ:なぜあなたの記録は永遠にあなたのテスト実行に影響を与えるか?
ボブ:私の論理がデータベースにものを引っ張って、格納しているので、私はそれをテストする必要があります.
スティーブ:なぜあなたのロジックは、データベースに引っ張って格納されていますか?
ボブ:Uhhh ...それは私がどのようにレールを書く方法を学びましたか?あなたは約六角形について私に講義をしていないですか?
スティーブ:いいえ、しかし、あなたは人々が通常レールを書く方法で、速いテストスイートを見ましたか?
ボブ:いいえ、しかし、私はあなたが何かについて行っているように感じます.
Steve :したがって、高速テストスイートの鍵は、できるだけ多くの状態を扱うことから論理の扱いを切り離すことです.それはほとんどの場合かなり簡単です.まず、データベースからデータを展開します.次に、データのロジックを実行します.最後に、トランザクション内のデータベースに結果を保存します.それは何を得るのですか?
ボブ:私は、あなたがビジネスロジックの中で高価なデータベース依存関係を持っていないと思います.
Steve :はい、完全なユニットのテストは成功と失敗を必要とします.なぜなら、トランザクションが実行し成功しない限り、どれも問題ないからです.
ボブ:thatsすべてのですが、ActiveRecordは、データベースを照会することができるように多くのメソッドを持って、それは簡単に取得取得することです.
スティーブ:はい、それはトリッキーなものです.接続を無効にするようなことができます.たとえば、既存の接続指定に切り替えることでデータベースを呼び出すのを防ぎます.
ボブ:もう1回以上行ってください.我々は、ロジック内のデータベースへの呼び出しを回避することにより、テスト速度を向上させます.まずすべての必要なデータを抽出し、データのロジックを実行し、データベースに最後に保存します.少しの例はありますか.
スティーブ:それは正しい.以下にコントローラの例を示します:
Steve :四角形は六角形のプレイですが、4部しかありません.コントローラ、状態、ロジック、ビュー.
スティーブ:なぜ彼らはそんなに長くかかりますか?
ボブ:私のレコードを作成し、データベースに保存する永遠にかかる!
スティーブ:なぜあなたの記録は永遠にあなたのテスト実行に影響を与えるか?
ボブ:私の論理がデータベースにものを引っ張って、格納しているので、私はそれをテストする必要があります.
スティーブ:なぜあなたのロジックは、データベースに引っ張って格納されていますか?
ボブ:Uhhh ...それは私がどのようにレールを書く方法を学びましたか?あなたは約六角形について私に講義をしていないですか?
スティーブ:いいえ、しかし、あなたは人々が通常レールを書く方法で、速いテストスイートを見ましたか?
ボブ:いいえ、しかし、私はあなたが何かについて行っているように感じます.
Steve :したがって、高速テストスイートの鍵は、できるだけ多くの状態を扱うことから論理の扱いを切り離すことです.それはほとんどの場合かなり簡単です.まず、データベースからデータを展開します.次に、データのロジックを実行します.最後に、トランザクション内のデータベースに結果を保存します.それは何を得るのですか?
ボブ:私は、あなたがビジネスロジックの中で高価なデータベース依存関係を持っていないと思います.
Steve :はい、完全なユニットのテストは成功と失敗を必要とします.なぜなら、トランザクションが実行し成功しない限り、どれも問題ないからです.
ボブ:thatsすべてのですが、ActiveRecordは、データベースを照会することができるように多くのメソッドを持って、それは簡単に取得取得することです.
スティーブ:はい、それはトリッキーなものです.接続を無効にするようなことができます.たとえば、既存の接続指定に切り替えることでデータベースを呼び出すのを防ぎます.
class ApplicationRecord
def self.with_no_connection!(&block)
old_name = connection_specification_name
self.connection_specification_name = 'with_no_connection active'
yield
self.connection_specification_name = old_name
end
end
ボブ:私はテスト中にそれを使うことができました、しかし、私がテスト懸念から500 sを得ないように、生産ででなく.class ApplicationRecord
def self.with_no_connection(&block)
if Rails.env.test?
with_no_connection!(&block)
else
block.call
end
end
end
スティーブ:良いコール.ボブ:もう1回以上行ってください.我々は、ロジック内のデータベースへの呼び出しを回避することにより、テスト速度を向上させます.まずすべての必要なデータを抽出し、データのロジックを実行し、データベースに最後に保存します.少しの例はありますか.
スティーブ:それは正しい.以下にコントローラの例を示します:
class MovesController < ApplicationController
def create
# query db, build objects
person = Person.include(:places).find(params[:id])
old_place = person.current_place
new_place = Place.find_by(params[:new_address])
# pass objects to stateless logic
ApplicationRecord.with_no_connection {
Move.call(person, old_place, new_place)
}
# save state in transaction
transaction do
person.save!
old_place.save!
new_place.save!
end
head :no_content
end
end
ボブ:それは通常のレールにかなり近いように見えます、そして、移動テストで私はデータベースで何も必要としません!面白い.この記事のタイトルは何ですか?Steve :四角形は六角形のプレイですが、4部しかありません.コントローラ、状態、ロジック、ビュー.
Reference
この問題について(四角形), 我々は、より多くの情報をここで見つけました https://dev.to/kwstannard/quadragonal-3m19テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol