2016-09-23 24 views
0

我是Rspec的新手。我正在编写一个测试用例来涵盖模型中的某些操作。这里是我的RSpec代码RSpec返回所有对象为'无'

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总是返回零。在我的调试器中,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那么无论如何,你应该从创建issuebefore块使用let改变:

​​