在测试Rails模型的setter时,你如何模拟params?

时间:2008-09-18 14:45:57

标签: ruby-on-rails unit-testing testing testing-strategies

鉴于来自Complex Form part III的代码,您将如何测试虚拟属性?

  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:未定义的方法`stringify_keys!' for“new_tasks_attributes”:String

非常感谢有关改进此测试的任何建议。

2 个答案:

答案 0 :(得分:3)

看起来好像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

答案 1 :(得分:0)

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

另外,params对我来说很奇怪。 tasks.build()是否需要这样的输入:["new_tasks_attribute", {"name" => "paint fence"}]

如果没有,也许你真的想要Hash#each_key()而不是Hash#each()?

需要更多数据。此外,您可能会考虑使用Rails标记附带Ruby标记。