2008-09-18 75 views
1

鉴于Complex Form part III的代码,您将如何去测试虚拟属性?测试Rails模型的setter时,你如何模拟参数?

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

改善这个测试任何建议,将不胜感激。

回答

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 
0

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

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

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

需要更多数据。另外,你可能会考虑一个Ruby标签来陪伴你的Rails标签。