我正在编写一些规范,以下内容失败,但页面/ menus / 1在浏览器中正常加载。这是一个php应用程序的端口,这是我第一次使用RSpec。任何想法为什么它可能无法正常工作。
错误是:
1) MenusController GET 'show' should be succesful
Failure/Error: get :show, :id => 1
ActiveRecord::RecordNotFound:
Couldn't find MenuHeader with id=1
# ./app/controllers/menus_controller.rb:18:in `show'
# ./spec/controllers/menus_controller_spec.rb:7:in `block (3 levels) in <top (required)>'
但是特定的MenuHeader确实存在基于所有正常标准(控制台,mysql,浏览器)。我99%肯定我的规格有误:
require 'spec_helper'
describe MenusController do
describe "GET 'show'" do
it "should be succesful" do
get :show, :id => 1
response.should be_success
end
end
end
这是menus_controller.rb
def show
@menu_header_data=MenuHeader.find(params[:id])
respond_to do |format|
format.html # show.html.erb
# format.json { render json: @menu } to do
end
end
THX
答案 0 :(得分:4)
使用Rspec或TestUnit测试控制器时,我会使用Factory或Fixture传递id,而不是使用数据设置测试数据库。用类似的东西测试会更好:
使用FactoryGirl(我的推荐,但每个人都有自己的口味):
describe MenusController do
describe "GET 'show'" do
it "should be succesful" do
get :show, :id => Factory(:menu).id
response.should be_success
end
end
end
测试主要是为了确保控制器在提供有效数据时能够正确响应,并且使用工厂或夹具更不易碎。如果它基于硬件数据(如固定装置或数据库备份),那么维护测试套件将变得很痛苦,这最终会导致您放弃测试驱动开发而不是接受它。