1

次のテストでは、ログインしていないページへの訪問者が「404」を取得し、応答の content-type が html になることを期待しています。これは次のように表現しました。

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_withおよびrespond_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これは、の応答が空またはnil であることを意味します@controllerが、これは可能ですが、ブラウザーで見られる動作を反映していません。

私の推測では、私はこれ (Ruby/Rails/RSpec/etc/MVC 開発全般) で完全に無知なので、gem を 1 つまたは 2 つ忘れたか、何か他の愚かなことをしたのかもしれませんが、何を推測することもできず、数日間検索しても有用な手がかりは見つかりませんでした. 現在の gem 環境は次のとおりです。

 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ここでor@controller.responseを nilにする理由を特定する方法について何か提案はありますか? 実行を追跡するための私の大雑把な試みは実りがありませんでした。

前もって感謝します、

デレル

4

1 に答える 1

1

に置き換えbefore { visit root_path }てみてくださいbefore { get :home }

「visit」構文は、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?コントローラー アクションでtrue と false のケースをテストするために、ユーザーのログインをシミュレートする必要がある場合もあります。Devise を使用している場合は、Devise wikiに RSpec コントローラー仕様のセットアップに関する適切なチュートリアルがあります。

于 2013-01-18T05:03:35.780 に答える