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