2017-01-04 7 views
0

私は、テストケースを書くためにレールを使っていません。私はレールactiverecordのSQLクエリをテストしたい。 activerecordクエリをテストするために、私はテスト用のサンプルデータを提供するrailsのフィクスチャを使用しています。以下に示すようにRailsテストケース:グローバルなフィクスチャではなく、特定のテストケースのフィクスチャを作成する方法はありますか?

は当初、2つだけのレコードは私のフィクスチャファイルusers.ymlであった:

user1: 
    name: 'xxx' 

user2: 
name: 'xyz' 

さて、上記のデータで、私は、データベース内のレコードの数をカウント1のテストケースを書かれているされています2に等しいとそれは正常に動作します。しかし、問題は、他のテストケースのシナリオに必要なusers.ymlファイルにもう1人のユーザを追加すると、その数は3になり、テストケースは失敗します。

それぞれのテストケースが独自のフィクスチャデータを持つように特定のテストケースのフィクスチャを作成する方法はありますか?

答えが「はい」の場合、フィクスチャファイルに余分なユーザーレコードを追加してもデータベースのレコード数をカウントするテストケースが失敗しません。

+0

サードユーザーを作成したくない理由は何らかの理由がありますそのための治具を作成するのではなく、それを必要とするテストの範囲内で行うことができます。 –

+0

@AbassSesayテストの範囲内で第3のユーザーを作成するにはどうすればよいですか?これは私が探しているものです... –

+0

'User'モデルを使用していると想定していますので、' User.create() 'をテストグループのスコープで実行してください。君は。 –

答えて

1

この問題を解決するには、いくつかの方法があります。一部の人は、フィクスチャをまったく使用しないことをお勧めしますが、これは将来検討する価値があります。ただし、最も即時の解決策:これまでデータベースの特定の状態をテストしないでください。あなたのテストのように設定している場合:

it 'should add one' do 
    User.create(username: 'username') 
    assert_equal 2, User.count 
end 

の変化ではなく、単にユーザー数は1で上がったことをカウントする:実際には

it 'should add one' do 
    count = User.count 
    User.create(username: 'username') 
    assert_equal count + 1, User.count 
end 

、カスタムアサーションだけのためでありこのユースケース:

http://apidock.com/rails/ActiveSupport/Testing/Assertions/assert_difference

it 'should add one' do 
    assert_difference("User.count", 1) do 
    User.create(username: 'username') 
    end 
end 
+0

ありがとうございます。これは動作しますが、私が探しているのは、テストの範囲内でフィクスチャまたは追加のユーザを作成して、この新しく作成されたフィクスチャが他のテストケースで利用できないようにすることです。 –

+1

私はあなたがフィクスチャ。しかし、個々のテストファイルの 'before'ブロックにオブジェクトを作成することができます。 [Fabrication](https://www.fabricationgem.org/)gemは、必要なときにのみ作成されるオブジェクトのテンプレートを提供するのにも便利です。 – wendybeth

関連する問題