てすとを書くなど

海方面に去りたかったのですが、何となく引き籠り、というか留守番。こないだ試験の雛型までできたので、という事で試験をナニ。

むむむ

とりあえず devise のてすつはしない方向。以下なエントリを確認させて頂きつつ云々してみました。

とりあえず factory なソレを Gemfile に追加。

group :development, :test do
  gem 'factory_girl_rails', '4.1.0'
  gem 'rspec'
  gem 'sqlite3', '1.3.5'
  gem 'rspec-rails', '2.11.0'
end

で、bundle install しておいて spec/support に云々、とのこと。
もろもろでっち上げて試験動かしてみたのですが、失敗。よくよく考えてみるに factory なソレを作っていない。あら、でっちあげてもマクロが読めてなさげな Failure なメセジ。
あ、spec/supports だ。とほほ。spec/support って名前にしてたよorz
やれやれ、と思ったらまだ駄目。ControllerMacros の名前解決が云々とのこと。あら? よくよく見たら spec/support で良いのですね。spec_helper.rb の require な記述が以下。

# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

で、再び元の場所に戻ってしまっております。そいえば控えてなかったんですが出てるエラーが以下なカンジです。

     Failure/Error: login_user
     NameError:
       undefined local variable or method ...

試験の書き方てきに以下なカンジなのですが

    context "When user is signed in" do
      before do
        login_user
      end

      it "responds successfully with on HTTP 200 status code" do
        get :index
        expect(response).to be_success
        expect(response.code).to eq("200")
      end

以下のようにしてみても動作変わらず。

    context "When user is signed in" do
#      before do
#        login_user
#      end

      it "responds successfully with on HTTP 200 status code" do
        login_user
        get :index
        expect(response).to be_success
        expect(response.code).to eq("200")
      end

むむ、色々確認しつつ云々してるのですが、不具合が解決できぬ。

undefined method `login_user' for ControllerMacros:Module

てどーゆー意味だろ。未定義て。ちなみに spec/support/controller_macros.rb が以下。

module ControllerMacros
  def login_admin
    @request.env["devise.mapping"] = Devise.mappings[:admin]
    sign_in FactoryGirl.create(:admin)
  end

  def login_user
    controller.stub(:authenticate_user!).and_return true
    @request.env["devise.mapping"] = Devise.mappings[:user]
    user = FactoryGirl.create(:user)
    sign_in user
  end
end

うーん、解決しない。とりあえず一旦置いてみることに。

できてた

ええと、spec/support/devise.rb を作って

RSpec.configure do |config|
  config.include Devise::TestHelpers, :type => :controller
  config.include ControllerMacros, :type => :controller
end

extend じゃなくて include にしてます。で、spec/factory.rb を以下に。

FactoryGirl.define do
  factory :user do
#    name     "Michael Hartl"
    email    "michael@example.com"
    password "foobarbaz"
    password_confirmation "foobarbaz"
  end
end

name= が無い、って言われたのでコメントアウトしてパスワード 8 文字以上、って言われたので中身を増やしています。今度は

ActionView::Template::Error:
       Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true

みたいな怒られかた。ええと、config/environments/test.rb に以下を追加。

config.action_mailer.default_url_options = { :host => 'localhost:3000' }

まだ駄目。そもそもな試験の書き方が微妙なのかどうか。今はこんなカンジになっているのですが、

    context "When user is signed in" do
      before do
        login_user
      end

      it "responds successfully with on HTTP 200 status code" do
        get :index
        expect(response).to be_success
        expect(response.code).to eq("200")
      end

      it "renders the index template" do
        get :index
        expect(response).to render_template("index")
      end

      after do
        sign_out :user
      end
    end

こりゃ実装が駄目なのかな。レスポンスが 302 とか戻ってるみたいだし。
とりあえず長くなりそうなのでここで再度エントリ投入。

続き

レスポンス 302 なので be_success ではない模様。以下を参照させて頂き、

rspec/support/controller_macros.rb の login_user メソドを以下にしたら試験パスしました。

  def login_user
    controller.stub(:authenticate_user!).and_return true
    @request.env["devise.mapping"] = Devise.mappings[:user]
    user = FactoryGirl.create(:user)
    user.confirm!
    sign_in user
  end

いやはや。
燃料入れつつ製造続行するので、控えがあれば追記するかもしれません。