Ruby on rails RSpec分配未按预期工作

Ruby on rails RSpec分配未按预期工作,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,在简单ActiveRecord搜索功能中,我对控制器有以下规范: 规格: 模型和控制器很简单: 型号: 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/) &&

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

规格:

模型和控制器很简单:

型号:

  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(…)只返回具有指定值的对象,如预期的那样,该值为
到期日

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

2)TasksController GET#search返回
匹配给定的到期日
失败/错误:预期(分配(:任务))。到
eq任务搜索('filter'=>{due_date:'2013-01-01'})
预期:#
得到:#
您可能会假设,由于模型显然有效(这一结果和通过的单独模型规范证明了这一点),控制器有问题,但控制器非常简单。我还有一个功能规范,其中包含提交表单、触发
search
操作并查看输出的同一个控制器,并且输出仅包括一条正确的记录


我是否遗漏了一些关于
分配
如何工作、犯了愚蠢的错误或其他错误的信息?

这是选项B,愚蠢的错误

model方法将
params
散列的
filter
元素的值作为参数,而不是我需要发送到
GET#search
的伪
params
散列,该散列位于预期上方的行中。或者更清楚地说,替换:

expect(分配(:任务))。到eq Task.search('filter'=>{due_date:'2013-01-01'})


expect(assigns(:tasks))。到eq Task.search(截止日期:“2013-01-01”)”

为什么不在控制器中放置一些
logger.debug
跟踪以查看实际发生的情况?您要添加到查询中的
where
子句限制了搜索,因此如果
params
中的某些内容与您期望的不一样,您将看到太多的记录,事实上您已经看到了。这是一个很好的建议。我只是暂时使用了
put
,并编辑了上面的答案。支持控制器按预期工作的理论,与规范的输出相反。@Steve Rowley你可以尝试使用Pry-来真正了解下一次发生的事情,而不是puts。
  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
  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">]>