测试Rails模型的setter时如何模拟参数?

时间:2020-03-06 14:21:42  来源:igfitidea点击:

给定复杂表单第三部分中的代码,我们将如何测试虚拟属性?

def new_task_attributes=(task_attributes)
    task_attributes.each do |attributes|
      tasks.build(attributes)
    end
  end

我目前正在尝试像这样进行测试:

def test_adding_task_to_project
    p = Project.new
    params = {"new_tasks_attributes" => [{ "name" => "paint fence"}]}
    p.new_tasks_attributes=(params)
    p.save
    assert p.tasks.length == 1
  end

但我收到以下错误:

NoMethodError: undefined method `stringify_keys!' for "new_tasks_attributes":String

任何改进此测试的建议将不胜感激。

解决方案

看起来new_task_attributes =期望使用哈希数组,但是我们正在向其传递哈希值。试试这个:

def test_adding_task_to_project
  p = Project.new
  new_tasks_attributes = [{ "name" => "paint fence"}]
  p.new_tasks_attributes = (new_tasks_attributes)
  p.save
  assert p.tasks.length == 1
end

我们可以看到整个堆栈跟踪吗?它在哪里认为String#stringify_keys!被称为?

而且,参数对我来说看起来很奇怪。 task.build()是否期望这样的输入:["" new_tasks_attribute",{" name" =>" paint fence"}]]

如果不是,也许我们实际上想要的是Hash#each_key()而不是Hash#each()?

需要更多数据。另外,我们可以考虑将Ruby标签与Rails标签一起使用。