1

鉴于复杂表单第三部分的代码,您将如何测试虚拟属性?

  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!” 对于“new_tasks_attributes”:字符串

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

4

2 回答 2

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
于 2008-09-18T15:04:59.487 回答
0

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

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

如果没有,也许您实际上想要 Hash#each_key() 而不是 Hash#each()?

需要更多数据。此外,您可能会考虑将 Ruby 标记与 Rails 标记一起使用。

于 2008-09-18T15:11:26.100 回答