2013-01-17 25 views
1

在下面的测试中,我期待访问我的网页谁没有登录到'404'和内容类型的响应是HTML,我已经这样表示:`应该respond_with_content_type`和`应该respond_with`失败,因为回应是零

require 'spec_helper' 
require 'rspec-rails' 
#require 'shoulda' 
#require 'shoulda-matchers' 
#require 'shoulda/matchers/action_controller' 
describe StaticPagesController do 
    context "home page without being logged in" do 
    before { visit root_path } 
    it { should respond_with :missing } 
    it { should respond_with_content_type :html } 
    it { should_not render_template :application } 
    it { should_not render_with_layout } 
    it { should_not set_the_flash } 
    end 
end 

这是测试控制器:

class StaticPagesController < ApplicationController 
    def home 
    if signed_in? 
     redirect_to user_path 
    else 
     render layout: false, 
      file: %Q(#{ Rails.root }/public/404), 
      formats: [:html], 
      status: '404' 
    end 
    end 
end 

当我执行的测试中,respond_withrespond_with_content_type的匹配失败,

NoMethodError: undefined method `content_type' for nil:NilClass 
/home/rev/.rvm/gems/ruby-1.9.3-p194/gems/shoulda-matchers-\ 
1.4.2/lib/shoulda/matchers/action_controller/\ 
respond_with_content_type_matcher.rb:59:in `response_content_type' 

NoMethodError: undefined method `response_code' for nil:NilClass 
/home/rev/.rvm/gems/ruby-1.9.3-p194/gems/shoulda-matchers-\ 
1.4.2/lib/shoulda/matchers/action_controller/respond_with_matcher.rb:57: 
in `response_code' 

这是奇怪的,对我来说,因为这些方法是:

def response_content_type 
     @controller.response.content_type.to_s 
    end 

def response_code 
     @controller.response.response_code 
    end 

这将意味着@controller的响应为空或@controller是零,这是可能的,但并不反映我在浏览器中看到的行为。我猜,考虑到我在这方面(Ruby/Rails/RSpec/etc/MVC开发通常)是一个完整的n00b,我忘记了一两个宝石,或者我做了其他的事情愚蠢的,但我无法猜测出什么,而搜索的几天却没有发现任何有用的线索。这里是当前的宝石环境:

thor (0.16.0) 
bundler (1.2.1) 
childprocess (0.3.6) 
sprockets (2.2.2) 
rspec-mocks (2.12.1) 
rspec (2.12.0) 
selenium-webdriver (2.27.2) 
actionmailer (3.2.11) 
rdoc (3.12) 
polyglot (0.3.3) 
shoulda-matchers (1.4.2) 
mocha (0.10.5) 
rack-ssl (1.3.2) 
metaclass (0.0.1) 
shoulda-context (1.0.2) 
bcrypt-ruby (3.0.1) 
mime-types (1.19) 
websocket (1.0.6) 
rspec-rails (2.12.2) 
rspec-expectations (2.12.1) 
rack-test (0.6.2) 
lumberjack (1.0.2) 
treetop (1.4.12) 
stream (0.5) 
sass (3.2.5) 
listen (0.7.2) 
guard-rspec (2.4.0) 
bourne (1.1.2) 
xpath (1.0.0) 
uglifier (1.3.0) 
mail (2.4.4) 
nokogiri (1.5.6) 
activeresource (3.2.11) 
journey (1.0.4) 
rails (3.2.11) 
i18n (0.6.1) 
coderay (1.0.8) 
activemodel (3.2.11) 
activerecord (3.2.11) 
libwebsocket (0.1.7.1) 
rack-cache (1.2) 
builder (3.0.4) 
guard (1.6.1) 
rake (10.0.3) 
bootstrap-sass (2.2.2.0) 
coffee-script-source (1.4.0) 
slop (3.4.3) 
active_attr (0.7.0) 
rack (1.4.4) 
debugger-ruby_core_source (1.1.6) 
debugger (1.2.3) 
columnize (0.3.6) 
coffee-script (2.2.0) 
ffi (1.3.1) 
shoulda (3.3.2) 
sass-rails (3.2.6) 
arel (3.0.2) 
jquery-rails (2.1.4) 
debugger-linecache (1.1.2) 
tilt (1.3.3) 
coffee-rails (3.2.2) 
hike (1.2.1) 
actionpack (3.2.11) 
rb-inotify (0.8.8) 
railties (3.2.11) 
pry (0.9.11.2) 
rspec-core (2.12.2) 
rgl (0.4.0) 
diff-lcs (1.1.3) 
activesupport (3.2.11) 
addressable (2.3.2) 
libnotify (0.5.9) 
capybara (2.0.2) 
json (1.7.6) 
erubis (2.7.0) 
guard-spork (1.4.1) 
execjs (1.4.0) 
multi_json (1.5.0) 
tzinfo (0.3.35) 
spork (0.9.2) 
sqlite3 (1.3.7) 
method_source (0.8.1) 
rubyzip (0.9.9) 

如果我错过了上面的任何有用的信息,请让我知道。

有关如何识别为什么@controller@controller.response应该在这里为零的任何建议?我粗略地追查执行结果并不富有成效。

由于提前,

Derrell

回答

1

尝试用before { get :home }更换before { visit root_path }

“访问”语法通常与完整的堆栈验收规范一起使用,由Capybara和Webrat等库提供。 RSpec提供了一个特殊的上下文和辅助方法来执行控制器规格中的单个动作,您可以在这里阅读更多信息:https://www.relishapp.com/rspec/rspec-rails/v/2-12-2/docs/controller-specs。调用get(:home)将模拟对被测试控制器的“主”动作的GET请求。我相信这将设置@controller,正如您的shoulda匹配程序所期望的那样。

您可能还需要模拟登录用户以测试控制器操作中user_signed_in?的真假案例。如果您使用Devise,Devise wiki在设置RSpec控制器规格方面有很好的演练。

+0

这就是门票!现在看看我能理解**为什么**我想这样做(我很慢)。 谢谢! –