2010-02-02 37 views
13

在我的控制器規範我這樣做:RSpec的測試控制器後改變了我的PARAMS從符號串並打破我的測試

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

...在我的控制,我做什麼......

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

然而,這與以下錯誤消息失敗:

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

我不知道爲什麼發生這種情況的d如何讓它起作用

回答

15

這是因爲你傳遞的是符號而不是字符串。這應該可以解決它:

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

這裏有一個關於它的博客帖子:「Understanding Ruby Symbols

+0

你知道它可能使後通過它作爲一個象徵,我想創建一個從機械師藍圖哈希和他們返回符號不是字符串 – ssmithstone 2010-02-02 12:07:16

+0

我不認爲你可以做這樣的事情,這只是POST的工作方式 – marcgg 2010-02-02 12:49:43

2

@ssmithone你可以使用ActiveSupport::HashWithIndifferentAccess通過PARAMS作爲符號來代替字符串。這應該工作:

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