2010-02-02 4 views
13

Dans mon spec du contrôleur que je fais ceci:rspec tester un poste de contrôleur changeant mes params de symboles à cordes et de briser mes tests

it "should create new message" do 
    Client.should_receive(:create).with({:title => 'Mr'}) 
    post 'create' , :client => {:title => "Mr" } 
end 

... et dans mon contrôleur que je fais ...

def create 
    client = Client.create(params[:client]) 
end 

Toutefois, ce n'est en voie avec le message d'erreur suivant:

expected: ({:title=>"Mr"}) 
     got: ({"title"=>"Mr"}) 

Je me demande pourquoi cela se passe un d comment le faire fonctionner

Répondre

15

C'est parce que vous passez un symbole et pas une chaîne. Cela devrait corriger:

it "should create new message" do 
    Client.should_receive(:create).with({:title => 'Mr'}) 
    post 'create' , :client => {"title" => "Mr" } 
end 

est ici un blogpost à ce sujet: « Understanding Ruby Symbols »

+0

que vous savez s'il est possible de faire de la poste passe en tant que symbole que je veux créer le hachage à partir d'un plan de machiniste et ils retournent des symboles non chaînes – ssmithstone

+0

Je ne pense pas que vous peut faire une telle chose, c'est juste la façon dont le POST fonctionne – marcgg

2

@ssmithone vous pouvez utiliser ActiveSupport::HashWithIndifferentAccess pour passer params comme des symboles au lieu de chaînes. Cela devrait fonctionner:

it "should create new message" do 
    Client.should_receive(:create).with({:title => 'Mr'}.with_indifferent_access) 
    post 'create', :client => {:title => "Mr"} 
end