2016-09-23 6 views
0

私はRspecを初めて使用しています。私は、あるモデルでいくつかのアクションをカバーするテストケースを書いています。ここに私のRSpecのコードRSpecはすべてのオブジェクトを 'nil'に戻します

test_cover_image_spec.rb

require 'spec_helper' 

describe Issue do 

    before :each do 
    @issue = Issue.joins(:multimedia).uniq.first 
    binding.pry 
    end 

    describe '#release_cover_image' do 
    context 'While making an issue open' do 
     it 'should make issue cover in S3 accessible' do 
     put :update, :id => @issue.id, :issue => @issue.attributes = {:open => '1'} 
     end 
    end 
    end 

end 

@issueは常にnilを返します。私のデバッガでも、Issue.allは空の配列を返します。

+1

あなたはRSpecの中で、@を使用しないでください。 'let'を使うべきです – Aleksey

+2

テストデータベースで問題を最初に作成しないと意味があります。 – spickermann

+0

spickermannあなたはこれを答えにしてください。これは私のために働いた。 – krishna

答えて

0

テストは通常​​、単独で実行します。つまり、各テストでは、実行前にオブジェクトを設定する必要があります。テストの実行後、共通のテスト構成では、作成されたすべてのデータがテストデータベースから削除されます。つまり、使用する前にテストデータを作成する必要があります。このような例

require 'spec_helper' 

describe Issue do 
    # pass all attributes to create a valid issue 
    let(:issue) { Issue.create(title: 'Foo Bar') } 

    describe '#release_cover_image' do 
    context 'While making an issue open' do 
     it 'should make issue cover in S3 accessible' do 
     put :update, id: issue.id, issue: { open: '1' } 

     expect(issue.reload.open).to eq('1') 
     end 
    end 
    end 
end 
0

この作業を行うには、最初にテストデータベースを作成する必要があります。

チェックアウト - テストデータを簡単に生成するためによく使用されます。

だから、あなたは、いくつかの工場を作成する必要があります(一般的な考え方は、ということです):

  • issues_factory.rb
  • multimedia_factory.rb

issueオブジェクトを生成し、それらを使用テストを実行します。あなたがfactory_girlを使用するつもりはない場合

その後、とにかくあなたはletを使用してissuebeforeでブロックを作成から変更する必要があります。

​​
関連する問題