2008-09-18 6 views
1

Étant donné le code du Complex Form part III, comment voulez-vous tester l'attribut virtuel?Comment simulez-vous les params lors du test du setter d'un modèle Rails?

def new_task_attributes=(task_attributes) 
    task_attributes.each do |attributes| 
     tasks.build(attributes) 
    end 
    end 

Je suis actuellement en train de le tester comme ceci:

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 

Mais je reçois l'erreur suivante:

NoMethodError: undefined method `stringify_keys!' for "new_tasks_attributes":String

Toutes les suggestions sur l'amélioration de ce test seraient grandement appréciés.

Répondre

3

Il semble que new_task_attributes = attende un tableau de hachages, mais vous lui passez un hachage. Essayez ceci:

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

Peut-on voir toute la trace de la pile? Où pense-t-il String # stringify_keys! est appelé?

En outre, params me semble étrange. Est-ce que tasks.build() attend une entrée comme ceci: ["new_tasks_attribute", {"name" => "paint fence"}]?

Si ce n'est pas le cas, peut-être que vous voulez vraiment Hash # each_key() au lieu de Hash # each()?

Besoin de plus de données. En outre, vous pourriez envisager une étiquette Ruby pour accompagner votre tag Rails.

Questions connexes