RSpec指定不按预期工作

时间:2013-12-29 01:09:16

标签: ruby-on-rails ruby rspec

我在简单的ActiveRecord搜索功能中有以下控制器规范:

规格:

it "returns the records that match the given due date" do
  create(:task, due_date: '2013-01-01')
  create(:task, due_date: '2014-01-01')
  get :search, 'filter' => { due_date: '2013-01-01' }
  expect(assigns(:tasks)).to \
    eq Task.search('filter' => { due_date: '2013-01-01' })
end

模型和控制器很简单:

型号:

  def self.search(params)   
    result = self.all     #I know this is a bad idea, but starting simple.
    params.each do |field, criteria|
      if field.match(/due_date|completed_date/) && criteria != nil
        result = result.where("DATE(#{field}) = ?", criteria)
      end
    end
    result
  end

控制器操作:

  def search
    @tasks = Task.search(params['filter'])

    #output from when the spec runs below
    #puts params           -> {"filter"=>{"due_date"=>"2013-01-01"}, \
    #                                     "controller"=>"tasks", \
    #                                     "action"=>"search"}

    #puts params['filter]  -> {"due_date"=>"2013-01-01"}
    #puts @tasks.inspect   -> just the one record

    render 'index'
  end

规范失败,但它似乎失败了,因为控制器正在返回两个对象,而Task.search(...)只返回具有due_date指定值的对象,如预期的那样。 / p>

以下是错误消息(为长度编辑):

  2) TasksController GET #search returns the records that 
     match the given due date

     Failure/Error: expect(assigns(:tasks)).to 
       eq Task.search('filter' => { due_date: '2013-01-01' })  

     expected: #<ActiveRecord::Relation 
       [#<Task id: 1, 
       due_date: "2013-01-01 00:00:00",
       completed_date: "2013-12-22 03:57:37">,
       #<Task id: 2, due_date: "2014-01-01 00:00:00",
       completed_date: "2013-12-22 03:57:37">]>

     got: #<ActiveRecord::Relation
       [#<Task id: 1,
       due_date: "2013-01-01 00:00:00",
       completed_date: "2013-12-22 03:57:37">]>

你会认为,因为模型显然有效(正如这个结果和单独的模型规范所证明的那样),控制器出现了问题,但控制器很简单。我还有一个功能规范,包含提交表单的同一个控制器,触发search操作并查看输出,输出只包含一个正确的记录。

我是否遗漏了assigns如何运作,犯了一个愚蠢的错误或其他错误?

1 个答案:

答案 0 :(得分:0)

这是选项B,愚蠢的错误。

模型方法将filter哈希的params元素的值作为参数,而不是我需要发送到params的假GET #search哈希值。超出预期。或者更清楚的是,替换:

expect(assigns(:tasks)).to eq Task.search('filter' => { due_date: '2013-01-01' })

expect(assigns(:tasks)).to eq Task.search(due_date: '2013-01-01')'