我在简单的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
如何运作,犯了一个愚蠢的错误或其他错误?
答案 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')'