在测试 Rails 模型的 setter 时如何模拟参数?
-
01-07-2019 - |
题
鉴于代码来自 复杂形式第三部分 您将如何测试虚拟属性?
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 标签一起使用。
不隶属于 StackOverflow