我们有一个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响应,但没有控制器是没有意义的。
答案 0 :(得分:0)
如上面与迈克的讨论所示 - 事实证明“@controller”对Ruby来说是特殊的。
我碰巧可能是唯一一个成为命名冲突的行业。我们为灌溉控制器管理一项服务,所以这个词总是让我头疼 - 我在谈论MVC控制器还是实际的设备?
这可能是其他任何人都不会遇到的负担,因为它不是您想要使用的变量。
总之 - 不要在任何地方调用@controller。