Rails 3.1,RSpec - 失败但页面加载正常

时间:2011-10-05 01:40:38

标签: ruby-on-rails ruby-on-rails-3 rspec

我正在编写一些规范,以下内容失败,但页面/ 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

1 个答案:

答案 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

测试主要是为了确保控制器在提供有效数据时能够正确响应,并且使用工厂或夹具更不易碎。如果它基于硬件数据(如固定装置或数据库备份),那么维护测试套件将变得很痛苦,这最终会导致您放弃测试驱动开发而不是接受它。