如何在JBuilder中使用RSpec?

bee*_*lez 6 unit-testing rspec ruby-on-rails jbuilder

我正在寻找一种干净的方式来使用JBuilder并使用RSpec测试json输出.JSON测试的流行方式是实现as_json方法,然后在RSpec中将接收到的对象与object.to_json方法进行比较.但是我使用JBuilder的一个重要原因是我不想要to_json吐出的所有属性; 所以这打破了比较.

目前使用JBuilder我必须执行以下操作来测试RSpec结果:

1)创建一个Factory对象:@venue

2)在我的RSpec测试中创建一个包含"预期"JSON字符串的哈希

@expected => {:id => @venue.id,:name=>@venue.name..........}
Run Code Online (Sandbox Code Playgroud)

2)将@expected字符串与从JSON调用返回的results.response.body进行比较.

这似乎很简单,除了我用15个以上的属性渲染对象,并且构建@expected哈希字符串很麻烦且非常脆弱.有一个更好的方法吗?

Dou*_*ell 6

我不喜欢通过视图测试 JSON API,因为您必须在测试中基本上模仿已经在控制器中完成的设置。此外,绕过控制器,您并没有真正测试 API。

但是,在控制器测试中,您会发现响应正文中没有返回任何 JSON。响应正文为空。这是因为 RSpec 在控制器测试中禁用了视图渲染。(无论好坏。)

为了对您的视图呈现 JSON API 进行 RSpec 控制器测试,您必须render_views在测试的顶部添加指令。请参阅此博客文章(不是我的),了解有关在 Jbuilder 中使用 RSpec 控制器测试的更多详细信息。

另外,请参阅此答案


小智 5

您应该能够使用RSpec视图规范来测试Jbuilder视图。您可以在https://www.relishapp.com/rspec/rspec-rails/v/2-13/docs/view-specs/view-spec上查看文档。

位于'app / views / api / users / _user.json.jbuilder'的文件的示例规范可能如下所示(spec / views / api / users / _user.json.jbuilder_spec.rb):

require 'spec_helper'

describe 'user rendering' do
  let(:current_user) { User.new(id: 1, email: 'foo@bar.com') }

  before do
    view.stub(:current_user).and_return(current_user)
  end

  it 'does something' do
    render 'api/users/user', user: current_user

    expect(rendered).to match('foo@bar.com')
  end
end
Run Code Online (Sandbox Code Playgroud)