10

次の失敗があります。

Failures:

  1) RelationshipsController creating a relationship with Ajax should increment the Relationship count
     Failure/Error: xhr :post, :create, relationship: { followed_id: other_user.id }
     NoMethodError:
       undefined method `authenticate!' for nil:NilClass
     # ./spec/controllers/relationships_controller_spec.rb:14:in `block (4 levels) in <top (required)>'
     # ./spec/controllers/relationships_controller_spec.rb:13:in `block (3 levels) in <top (required)>'

しかし、非常に奇妙です。サイトにアクセスすると、機能します ( [フォローfollowers] ボタンをクリックすると、カウンターが増加します:

ここに画像の説明を入力

そして、最も奇妙なことは、認証がないことです! relationship_controller_spec.rbのメソッド:

require 'spec_helper'

describe RelationshipsController do

  let(:user) { FactoryGirl.create(:user) }
  let(:other_user) { FactoryGirl.create(:user) }

  before { sign_in user }

  describe "creating a relationship with Ajax" do

    it "should increment the Relationship count" do
      expect do
        xhr :post, :create, relationship: { followed_id: other_user.id }
      end.to change(Relationship, :count).by(1)
    end

    it "should respond with success" do
      xhr :post, :create, relationship: { followed_id: other_user.id }
      response.should be_success
    end
  end

  describe "destroying a relationship with Ajax" do

    before { user.follow!(other_user) }
    let(:relationship) { user.relationships.find_by_followed_id(other_user) }

    it "should decrement the Relationship count" do
      expect do
        xhr :delete, :destroy, id: relationship.id
      end.to change(Relationship, :count).by(-1)
    end

    it "should respond with success" do
      xhr :delete, :destroy, id: relationship.id
      response.should be_success
    end
  end
end

コントローラーでも:

class RelationshipsController < ApplicationController
  before_filter :authenticate_user!

  def create
    @user = User.find(params[:relationship][:followed_id])
    current_user.follow!(@user)
    respond_to do |format|
      format.html { redirect_to @user }
      format.js
    end
  end

  def destroy
    @user = Relationship.find(params[:id]).followed
    current_user.unfollow!(@user)
    respond_to do |format|
      format.html { redirect_to @user }
      format.js
    end
  end
end

何が問題なのですか?

(ちなみに、これらのテストはRuby on Rails チュートリアルに従って行われました。その後、Deviseを使用したかったので、すべての認証システムを削除しました。)

4

2 に答える 2

22

設定config.include Devise::TestHelpers, :type => :controllerは、Devise の以降のバージョンでは機能しなくなりました。必要なことは、匿名ユーザーをログアウトして、適切な変数を設定することです。

before :each do
  sign_out :user
end
于 2014-01-16T15:50:32.420 に答える
15

これを追加する必要がありました:

spec_helpers.rb:

RSpec.configure do |config|
  config.include Devise::TestHelpers, :type => :controller
end
于 2012-11-01T01:05:24.533 に答える