RSpec - 访问数组方法

时间:2016-11-29 15:36:40

标签: ruby-on-rails rspec

我很擅长测试和挣扎一些概念。我理解这个想法是通过模拟和存根来隔离测试事物,但是我正在努力解决以下问题:

class Circle
  has_many :jobs

  def accepted
    jobs.where('sitter_id > 0')
  end
end

class Job
  belongs_to :circle
end

我的RSpec:

require 'rails_helper'

RSpec.describe Circle, type: :model, focus: true do

  let (:circle_1) { FactoryGirl.create(:circle, title: 'London',
                                                location: 'London',
                                                administrator_id: 1) }

  let (:job_1) { FactoryGirl.create(:job, start_time: "2016-11-14 20:00:00",
                                          end_time: "2016-11-14 23:00:00",
                                          tokens_offered: 6,
                                          requester_id: 1,
                                          circle_id: 1,
                                          sitter_id: 5,
                                          actual_start_time: "2016-11-14 20:00:00",
                                          actual_end_time: "2016-11-14 23:30:00",
                                          tokens_paid: 7) }

  before do
    circle_1.stub(:jobs).and_return([job_1])
  end

  describe 'instance methods' do
    context 'accepted' do 
      it 'should return jobs with a sitter' do 
        expect(circle_1.accepted).to include(job_1)
      end
    end
  end
end

这导致:

NoMethodError:
   undefined method `where' for #<Array:0x007feb4ae72858>

然后我会在数组中存根where方法的行为吗?令我困惑的是,这正是我正在测试的内容,通过对其进行存根,我基本上是在告诉测试代码的作用而不是测试代码本身?

如果有人能够解释我是否理解这个错误,无论以何种方式重写测试或让它通过,我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

问题在于您将AR集合存根到数组对象,当然这种方法没有where方法。

您想在工厂级别建立关联。你可以用

来实现它
circle_id: circle_1.id # in job_1

有了这个,你就不必为工作集合存根,你的测试将按预期工作。