2013-01-17 68 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

這就是門票!現在看看我能理解**爲什麼**我想這樣做(我很慢)。 謝謝! –