【问题标题】:RSpec returns all objects to be 'nil'RSpec 将所有对象返回为“nil”
【发布时间】:2016-09-23 11:37:12
【问题描述】:

我是 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 返回一个空数组。

【问题讨论】:

  • 你不应该在 Rspec 中使用 @。你应该使用let
  • 当您不首先在测试数据库中创建问题时,这是有道理的。
  • spickermann 你能把这个作为答案吗?这对我有用。

标签: ruby-on-rails ruby unit-testing rspec


【解决方案1】:

测试通常单独运行。这意味着每个测试都需要在运行之前设置对象。测试运行后,通用测试配置从测试数据库中删除所有创建的数据。这意味着您需要先创建测试数据,然后才能使用它。

例如这样:

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

【讨论】:

    【解决方案2】:

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

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

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

    • issues_factory.rb
    • multimedia_factory.rb

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

    如果您不打算使用 factory_girl,那么无论如何您都应该从在 before 块中创建 issue 更改为使用 let

    let(:issue) { Issue.create }
    

    【讨论】:

      猜你喜欢
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      相关资源
      最近更新 更多