Ruby on rails 为什么RSpec会“给予”;尝试解锁未锁定的互斥锁";尝试单击按钮时出错?

Ruby on rails 为什么RSpec会“给予”;尝试解锁未锁定的互斥锁";尝试单击按钮时出错?,ruby-on-rails,rspec,capybara,Ruby On Rails,Rspec,Capybara,我正在尝试测试登录时应该/不应该看到的链接,但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:i

我正在尝试测试登录时应该/不应该看到的链接,但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)>'
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)>'
以及我的登录功能:

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!"

并导致以下错误:

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)>'
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)>'
Nokogiri::CSS::SyntaxError:
意外在“[#]之后
#(评估):3:在“racc\u do\u parse\u c”中
#(eval):3:在“do_parse”中
#(评估):2:在“查找”中
#./spec/support/utilities.rb:5:in'sign\u in'
#./spec/views/header_spec.rb:19:in'block(3层)in'
然后我尝试用“登录我”替换我的按钮文本,没有感叹号, 水豚抛出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)>'
失败/错误:在{sign_in user}之前
Capybara::ElementNotFound:
找不到css“登录我”
#(评估):2:在“查找”中
#./spec/support/utilities.rb:5:in'sign\u in'
#./spec/views/header_spec.rb:19:in'block(3层)in'

总的来说,我对RSpec和Rails还是相当陌生的,但到目前为止,我已经能够很好地找到自己的方法。这件事把我彻底难住了。

因此,在昨晚胡闹了一番之后,我终于找到了解决办法,并立即开始面对桌面。我正在将SessionHelper与我的SessionController一起使用,并且我在类外使用了include语句:

include SessionsHelper

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

  def new
  end
  ...
  ...
  ...
end
include sessionhelp
类sessioncontroller
通过将include语句移动到类中:

include SessionsHelper

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

  def new
  end
  ...
  ...
  ...
end
class sessioncontroller

我所有的考试都开始通过了。虽然我的测试在类块之外的include语句中失败,但实际的功能似乎运行良好。我可以登录/注销,cookie存储了正确的信息,并且我在服务器控制台中没有看到任何错误。

如果您注释掉
登录中的最后一行,是否仍然会发生错误?@tanzeebkhali注释掉
cookie[:记住\u token]=用户。记住_token
仍会抛出相同的错误。我尝试将
单击按钮“登录!”
替换为
查找(:按钮,“登录!”)
,结果导致与结尾感叹号相关的非常长的Nokogiri错误。将按钮文本替换为不带感叹号的“Log me in”(登录我),会导致Capybara错误
无法找到css“Log me in”
。如果使用click_on而不是click_按钮,则会出现相同的错误。您的规范(我假设spec/views/header_spec.rb)是否有原因是spec/requests目录下的视图规范,而不是集成规范?根据,视图规范“单独渲染视图模板”,这与调用
单击按钮
填充按钮
时的操作不一样。不确定它是否会起作用,但也许可以尝试将您的规范或文件本身移动到规范/请求中。@PaulFioravanti我今天下午在开始工作之前确实尝试过,但没有成功。此外,将
单击按钮更改为
单击按钮将导致相同的错误。如果值得一提的话,我还有另外一个测试用户注册页面的规范,
click\u按钮
功能在其中运行良好。我的注册页面为
使用了一个
表单,而我的登录表单是一个简单的
表单标签
,这会有什么不同吗?