0

ログイン時に表示されるはずのリンクと表示されないリンクをテストしようとしていますが、RSpecは次のエラーをスローします。

Failure/Error: before { sign_in user }
ThreadError:
  Attempt to unlock a mutex which is not locked
  # (eval):2:in `click_button'
  # ./spec/support/utilities.rb:5:in `sign_in'
  # ./spec/views/header_spec.rb:19:in `block (3 levels) in <top (required)>'

私のテストブロックは次のようになります。

describe "when signed in" do
  let(:user) { FactoryGirl.create(:user) }
  before { sign_in user }

  it { should have_link("Sign out") }
  it { should_not have_link("Sign up") }
  it { should_not have_link("Log in") }
end 

そして私のsign_in関数:

def sign_in(user)
  click_link "Log in"
  fill_in "username", with: user.username
  fill_in "password", with: user.password
  click_button "Log me in!"
  cookies[:remember_token] = user.remember_token
end

着替えてみました

click_button "Log me in!"

find(:button, "Log me in!").click

その結果、次のエラーが発生します。

Nokogiri::CSS::SyntaxError:
   unexpected '!' after '[#<Nokogiri::CSS::Node:0x00000003645778 @type=:DESCENDANT_SELECTOR, @value=[#<Nokogiri::CSS::Node:0x000000036464e8 @type=:ELEMENT_NAME, @value=["Log"]>, #<Nokogiri::CSS::Node:0x000000036458b8 @type=:DESCENDANT_SELECTOR, @value=[#<Nokogiri::CSS::Node:0x00000003645f98 @type=:ELEMENT_NAME, @value=["me"]>, #<Nokogiri::CSS::Node:0x000000036459f8 @type=:ELEMENT_NAME, @value=["in"]>]>]>]'
 # (eval):3:in `_racc_do_parse_c'
 # (eval):3:in `do_parse'
 # (eval):2:in `find'
 # ./spec/support/utilities.rb:5:in `sign_in'
 # ./spec/views/header_spec.rb:19:in `block (3 levels) in <top (required)>'

次に、感嘆符なしでボタンのテキストを「ログイン」に置き換えようとしましたが、CapybaraはElementNotFoundエラーをスローします。

Failure/Error: before { sign_in user }
 Capybara::ElementNotFound:
   Unable to find css "Log me in"
 # (eval):2:in `find'
 # ./spec/support/utilities.rb:5:in `sign_in'
 # ./spec/views/header_spec.rb:19:in `block (3 levels) in <top (required)>'

私はまだRSpecとRails全般にかなり慣れていませんが、これまでのところ、かなりうまく回避することができました。これは私を完全に困惑させました。

4

1 に答える 1

1

それで、昨夜少しおしゃべりした後、私はついに解決策を見つけ、すぐにフェイスデスクを始めました。SessionsControllerでSessionsHelperを使用していて、クラスの外にincludeステートメントがあります。

include SessionsHelper

class SessionsController < ApplicationController
  def new
  end
  ...
  ...
  ...
end

クラス内でincludeステートメントを移動することにより:

class SessionsController < ApplicationController
  include SessionsHelper

  def new
  end
  ...
  ...
  ...
end

私のテストはすべて合格し始めました。クラスブロック外のincludeステートメントでテストが失敗しましたが、実際の機能は正常に機能しているように見えました。サインイン/サインアウトでき、Cookieは正しい情報で保存されていて、サーバーコンソールにエラーはまったく表示されませんでした。

于 2012-07-14T17:44:05.910 に答える