2014-07-17 51 views
1

我只想测试一个控制器方法传递一个int。规范 - 简单的JSON API调用

测试:

it 'responds successfully with mocked fto hours remaining' do 
    get :fto_hours_remaining, {}, { "Accept" => "application/json" } 

    json = JSON.parse(response.body) 
    expect(json['hours_remaining']).to be_100 
    end 

控制方法(我试过注释掉块太):

def fto_hours_remaining 
    @fto_hours_remaining = 100 

    render json: @fto_hours_remaining 
    # respond_to do |format| 
    # format.json { render :json => {:hours_remaining => @fto_hours_remaining} } 
    # end 
    end 

我得到的错误:JSON::ParserError: 757: unexpected token at '100'带有指向json = JSON.parse(response.body)

任何人的错误看一个失误?谢谢。

回答

1

所以,你必须在你的控制权版本:

def fto_hours_remaining 
    @fto_hours_remaining = 100 
    render :json => { :hours_remaining => @fto_hours_remaining } 
end 

你现在就行动起来渲染只是字符串100这是无效的JSON。

尝试在IRB:

=> require 'json' 
=> true 
=> JSON.parse "100" 
=> JSON::ParserError: 757: unexpected token at '100' 

render(json: { hours_remaining: @fto_hours_remaining })手段使我json格式这个哈希{ hours_remaining: @fto_hours_remaining },应该是有效的JSON:

{ 
    "hours_remaining": 100 
} 

而且测试:

# return string "100" 
number = json['hours_remaining'] 
# fails beacause "100" != 100 
expect(json['hours_remaining']).to be_100 
# try this 
expect(json['hours_remaining']).to eq("100")