2012-07-10 71 views
0

我試圖測試應該/不應該被登錄時看到的鏈接,但RSpec的是拋出以下錯誤:爲什麼在嘗試使用click_button時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)>' 

我然後試圖用「登錄我」來代替我的按鈕上的文字,如果沒有感嘆號, 和水豚拋出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,但到目前爲止,我一直能夠找到自己的方式。這一個讓我完全陷入困境。

+0

如果您註釋掉'sign_in'中的最後一行,錯誤是否仍然發生? – 2012-07-11 05:17:08

+0

@TanzeebKhalili評論'cookies [:remember_token] = user.remember_token'行仍然會拋出同樣的錯誤。我嘗試用'find(:button,「Log me in!」)'替換'click_button'登錄我!''並導致與最後感嘆號相關的非常長的Nokogiri錯誤。替換按鈕文本只是「登錄我」,沒有感嘆號,導致水豚錯誤「無法找到CSS」登錄我「。 – TKGibson 2012-07-11 07:07:29

+0

如果使用click_on而不是click_button,會出現同樣的錯誤? – 2012-07-11 12:41:29

回答

1

所以昨晚瞎扯了一下後,我終於找到了解決辦法,並立即開始面對面。我使用的是SessionsHelper我SessionsController,我有我的包含類之外聲明:

include SessionsHelper 

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

通過移動階級內部的include語句:

class SessionsController < ApplicationController 
    include SessionsHelper 

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

我的測試全部開始走了。雖然我的測試失敗了,但在類塊之外的include語句中,實際的功能似乎工作正常。我可以登錄/註銷,cookie正在存儲在正確的信息中,而且我在服務器控制檯中看到沒有任何錯誤。