2010-02-02 35 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