鉴于代码来自 复杂形式第三部分 您将如何测试虚拟属性?

  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

但我收到以下错误:

无方法错误:未定义的方法“ stringify_keys!”对于“ new_tasks_attributes”:字符串

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

有帮助吗?

解决方案

看起来 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! 在哪里?正在被呼叫吗?

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top