为什么Rspec使用错误的对象进行控制器测试?

时间:2014-10-02 19:51:31

标签: ruby-on-rails ruby json unit-testing rspec

我们有一个API,我们返回一些结构化的JSON数据。站点has_many:控制器和控制器belongs_to:站点

对于测试,我们必须创建一个模拟站点和控制器,这在我们所有其他功能测试文件中实现,就像我在之前(:each)do块中列出的那样

测试:

describe Api::V2::SitesController, :type => :controller do
    render_views

    before(:each) do
        basic_auth_and_skip_hmac
        @site = FactoryGirl.create(:site)
        @user_site = FactoryGirl.create(:user_site, user: @user, site: @site)
        @controller = FactoryGirl.create(:controller, site: @site)
    end

    it 'List all sites' do
        get :index, format: :json
        puts response.body
        expect(response.body).to include("Site 1")
        expect(response.body).to include("Controller 1")
    end


end

但此控制器测试的响应是意外的:

Api::V2::SitesController
  List all sites (FAILED - 1)

Failures:

  1) Api::V2::SitesController List all sites
     Failure/Error: get :index, format: :json
     NoMethodError:
       undefined method `response_body=' for #<Controller:0x0000010db0c2d8>

为什么你甚至关心Controller对象Rspec的response_body?它清楚地表明我们正在描述SitesController!

删除控制器对象的创建以及文件底部的匹配期望,使测试按预期传递:

Finished in 0.60435 seconds (files took 5.38 seconds to load)
1 example, 0 failures

但我并没有真正测试我打算测试的所有内容,因为我的JSON包括:

"controllers":[]

在我们的应用程序中技术上不可能发生。控制器是我们最重要的测量单位,因此返回带有效站点信息的JSON响应,但没有控制器是没有意义的。

1 个答案:

答案 0 :(得分:0)

如上面与迈克的讨论所示 - 事实证明“@controller”对Ruby来说是特殊的。

我碰巧可能是唯一一个成为命名冲突的行业。我们为灌溉控制器管理一项服务,所以这个词总是让我头疼 - 我在谈论MVC控制器还是实际的设备?

这可能是其他任何人都不会遇到的负担,因为它不是您想要使用的变量。

总之 - 不要在任何地方调用@controller。