【发布时间】: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