5

Rspec と Capybara を使用して統合テストを作成しています。私は、activerecord オプションの作成をテストする際に、同じコードを実行しなければならないことが非常に多いことに気付きました。

例えば:

it "should create a new instance" do
  # I create an instance here
end

it "should do something based on a new instance" do
  # I create an instance here
  # I click into the record and add a sub record, or something else
end

問題は、ActiveRecord オブジェクトがテスト間で永続化されていないように思われますが、Capybara はデフォルトで仕様内で同じセッションを維持します (奇妙)。

これらのレコードをモックすることもできますが、これは統合テストであり、これらのレコードの一部は非常に複雑であるため (画像が添付されているなど)、Capybara を使用してユーザー向けフォームに入力する方がはるかに簡単です。

新しいレコードを作成する関数を定義しようとしましたが、何らかの理由で適切ではありません。これのベストプラクティスは何ですか?

4

5 に答える 5

10

ここに行くにはいくつかの方法があります。まず第一に、どちらの場合も、次のように、記述ブロックまたはコンテキスト ブロックの下にサンプル ブロックをグループ化できます。

describe "your instance" do
  it "..." do
    # do stuff here
  end

  it "..." do
    # do other stuff here
  end
end

次に、describe または context ブロック内で、次のように、すべての例で使用できる状態を設定できます。

describe "your instance" do
  # run before each example block under the describe block
  before(:each) do
    # I create an instance here
  end

  it "creates a new instance" do
    # do stuff here
  end

  it "do something based on a new instance" do
    # do other stuff here
  end
end

before(:each) ブロックの代わりに、let ヘルパーを使用することもできます。これはもう少し読みやすいと思います。詳細については、こちらを参照してください

于 2012-05-23T22:07:13.447 に答える
7

要件に対するベスト プラクティスは、Factory Girlを使用してブループリントから共通の属性を定義するレコードを作成し、 database_cleanerを使用してさまざまなテスト/仕様でデータベースをクリーンアップすることです。

また、異なる仕様間で状態 (作成されたレコードなど) を保持しないでください。依存仕様につながります。--order randrspecのオプションを使用して、この種の依存関係を見つけることができます。仕様がランダムに失敗する場合、この種の問題があります。

于 2012-05-23T22:02:24.337 に答える
3

タイトル (... Rspec でコードを再利用) を考えると、「Ruby on Rails チュートリアル」でRSpec カスタムマッチャーを読むことをお勧めします。

Michael Hartl は、仕様の重複に対する 2 つの解決策を提案しています。

  1. 一般的な操作 (ユーザーのログインなど) のヘルパー メソッドを定義します。
  2. カスタムマッチャーを定義する

これらのものを使用すると、テストを実装から切り離すのに役立ちます。

これらに加えて、(Fabio が言ったように) FactoryGirl を使用することをお勧めします。

于 2012-05-27T00:10:31.853 に答える
1

私のサンプル Rails プロジェクトを確認できます。そこにあるかもしれません: https://github.com/lucassus/locomotive

  • factory_girl の使い方
  • カスタム マッチャーとマクロの例 ( spec/support)
  • 使い方shared_examples
  • 最後に、とても素敵な shoulda-Macros の使い方
于 2012-05-27T21:49:04.010 に答える
0

factory_girl と Rspec の let メソッドを組み合わせて使用​​します。

describe User do
  let(:user) { create :user } # 'create' is a factory_girl method, that will save a new user in the test database

  it "should be able to run" do
    user.run.should be_true
  end

  it "should not be able to walk" do
    user.walk.should be_false
  end
end


# spec/factories/users.rb
FactoryGirl.define do
  factory :user do
    email { Faker::Internet.email }
    username { Faker::Internet.user_name }
  end
end

これにより、次のような素晴らしいことができます。

describe User do
  let(:user) { create :user, attributes }
  let(:attributes) { Hash.new }

  it "should be able to run" do
    user.run.should be_true
  end

  it "should not be able to walk" do
    user.walk.should be_false
  end

  context "when user is admin" do
    let(:attributes) { { admin: true } }
    it "should be able to walk" do
      user.walk.should be_true
    end
  end
end
于 2013-08-14T06:52:18.960 に答える