RSpec将所有对象返回为'nil'

时间:2016-09-23 11:37:13

标签: ruby-on-rails ruby unit-testing 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总是返回nil。在我的调试器中,Issue.all返回一个空数组。

2 个答案:

答案 0 :(得分:0)

要完成这项工作,您必须首先填充测试数据库。

查看factory_girl gem - 它最常用于轻松生成测试数据。

所以(一般的想法是)你将不得不创建几个工厂:

  • issues_factory.rb
  • multimedia_factory.rb

使用它们,在测试运行之前生成issue对象。

如果您不打算使用factory_girl,那么您应该从issue块中的before更改为使用let

let(:issue) { Issue.create }

答案 1 :(得分: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