Spec - 简单的json api调用

时间:2014-07-17 19:06:46

标签: ruby-on-rails json rspec

我只想测试一个控制器方法正在传递一个int。

测试:

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 个答案:

答案 0 :(得分: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")