【问题标题】:Why is Rspec using the wrong object for a controller test?为什么 Rspec 使用错误的对象进行控制器测试?
【发布时间】:2014-10-02 19:51:31
【问题描述】:

我们有一个 API,可以返回一些结构化的 JSON 数据。站点 have_many :controllers 和 Controllers belongs_to :site

对于测试,我们必须创建一个模拟站点和控制器,这在我们所有其他的 feature 测试文件中实现,就像我在下面的 before(: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

但是这个 controller 测试的响应是出乎意料的:

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 响应将毫无意义。

【问题讨论】:

  • 为什么要显式创建控制器?
  • 等等,你有一个叫“控制器”的模型吗?!
  • 这确实是问题所在。我们是一家灌溉公司,运行喷水灭火系统的设备称为控制器。我们有一个 control_controller.rb 来避免名称冲突,但我没有意识到 @controller 在 ruby​​ 中是特殊的。我们通过更改变量名来克服它。

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


【解决方案1】:

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

而且我碰巧在可能唯一会出现命名冲突的行业工作。我们管理灌溉控制器的服务,所以这个词总是让我头疼——我是在谈论 MVC 控制器还是实际设备?

这是一个可能没有其他人会遇到的负担,因为它不是你想使用的变量。

总而言之 - 几乎不要在任何地方调用@controller。

【讨论】:

    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多