Ruby on rails 4 使用Rspec进行测试会出现错误,但使用brower进行测试效果良好

Ruby on rails 4 使用Rspec进行测试会出现错误,但使用brower进行测试效果良好,ruby-on-rails-4,rspec,Ruby On Rails 4,Rspec,朋友们好,首先我要坦白,我以前的账户被禁止提问,从现在开始,我会尽量让问题更加清晰和准确 我正在编写Hartl的RubyonRails教程,几天来,我一直在第9.2.2章要求正确的用户“清单9.13测试编辑和更新操作是否需要正确的用户”。我做了大量的研究,我来回翻阅了很多章节,但都没有效果,似乎没有人有我现在遇到的问题。让我详细解释一下 错误: Authentication authorization as wrong user submitting a GET request to the U

朋友们好,首先我要坦白,我以前的账户被禁止提问,从现在开始,我会尽量让问题更加清晰和准确

我正在编写Hartl的RubyonRails教程,几天来,我一直在
第9.2.2章要求正确的用户
“清单9.13测试编辑和更新操作是否需要正确的用户”。我做了大量的研究,我来回翻阅了很多章节,但都没有效果,似乎没有人有我现在遇到的问题。让我详细解释一下

错误:

Authentication authorization as wrong user submitting a GET request to the Users#edit action 
     Failure/Error: specify { expect(response.body).not_to match(full_title('Edit user')) }
     TypeError:
       wrong argument type nil (expected Regexp)
     # ./spec/requests/authentication_pages_spec.rb:61:in `block (5 levels) in <top (required)>'

Finished in 1.77 seconds
64 examples, 1 failure
app/controllers/users\u controller.rb

class UsersController < ApplicationController
  before_action :signed_in_user, only: [:edit, :update]
  before_action :correct_user,   only: [:edit, :update]
  def show
    @user = User.find(params[:id])
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      sign_in @user
      flash[:success] = 'welcome'
      redirect_to @user
    else
      render 'new'
    end
  end

  def edit
    # @user = User.find(params[:id])
  end

  def update
    # @user = User.find(params[:id])
    if @user.update_attributes(user_params)
      flash[:success] = 'Profile updated'
      redirect_to @user
    else
      render 'edit'
    end
  end

  private

  def user_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation)
  end
  # Before filters

  def signed_in_user
    redirect_to signin_url, notice: 'Please sign in.' unless signed_in?
  end

  def correct_user
    @user = User.find(params[:id])
    redirect_to(root_path) unless current_user?(@user)
  end
end
class UsersController
在您的规范中:

expect(response.body).not_to match(full_title('Edit user'))
match
EXEPCTION需要将一些文本与正则表达式匹配,例如:

expect("hello").to match(/ell/)   # => true
expect("hello").to match(/blah/)  # => false
完整标题(“编辑用户”)
不是正则表达式。。。这是页面上的一些内容。因此,在
expect…match
中使用它确实是不正确的。您可以通过将任何字符串放入//并使用字符串插值语法将其转换为正则表达式,例如:

a_string = 'some string'
a_regex = /#{a_string}/
因此,这里您可以使用:

expect(response.body).not_to match(/#{full_title('Edit user')}/)
然而。。。您收到的错误消息表明有更深层次的问题。。。它表示传递的是nil而不是正则表达式。。。这意味着
full\u title('Edit user')
的计算结果为nil,而不是实际的字符串


如果你用我上面的例子。。。规范可能仍然会失败。。。因此,您必须找出
全名('Edit user')
返回nil的原因,并首先修复该问题。

看起来您跳过了一些练习,特别是第5.6节中的练习,这些练习本来可以防止出现错误

在任何情况下,在第5章中,教程让您为测试定义了一个重复的full_title()帮助器,该帮助器将放在文件中:

spec/support/utilities.rb
视图使用了原始的full_title()辅助对象

查看您的
spec/support/utilities.rb
文件,您有:

def full_title(page_title)
  base_title = 'Ruby on Rails Tutorial Sample App'
  if page_title.empty?
    base_title
  else
    "#{base_title} | #{page_title}"
  end

你能看出怎么了吗?很明显,您复制并粘贴了教程文本中的代码,但错过了最后一行:
end
,这是关闭从第一行开始的def所必需的。但是,我无法解释为什么您在尝试运行测试时没有得到语法错误,这会阻止测试在我尝试时运行。

您有什么版本的Hartl教程?我的副本上没有第9.13章,甚至没有Hi Pawel,我有这个版本的Hartl教程。非常感谢你的回复,我看到了希望!它在9.2.2要求正确的用户需要登录用户它在第9.2.2章清单9.13中,我刚刚修改了这个问题,感谢uLooks,就像github回购协议不是最新的一样。感谢u pawel7318,我跳过了rspec,我决定稍后再解决它。非常感谢你的努力谢谢你回答这个问题!我真的很感激!我已经被这个错误困扰了将近10天,在那之后我决定继续,现在我已经在第10章的末尾了,从那以后我一直在跳过rspec测试,在我读完教程之后,我会回去读一本关于rspec的书,我不确定我是否做得对,但是你的回答帮助我更多地理解rspec!非常感谢你!完整标题(“编辑用户”)不是正则表达式。。。这是页面上的一些内容。因此,在expect…match中使用它确实是不正确的。尽管我找不到这方面的文档(或google上的任何内容),match()确实使用了字符串参数,这是ROR Tut用于match()的参数。对不起,伙计们,我只是发现我不能同时接受两个答案,正如7stud提到的,我确实跳过了一些练习。我想那是我的问题。另一方面,塔林确实帮助我更多地了解了Rspec。但我真的很感激这两个答案。我希望我有足够的学分来支持这两个答案。谢谢你们。不幸的是,投票需要15个声誉,很抱歉我只有3个,我会投票直到我有15个声誉。:)我向你保证,塔林!尽管如此,我找不到相关文档,rspec match()方法只是调用主题上的match(),在本例中是response.body,它是一个字符串;String#match()将字符串或Regexp作为参数,String#match()会自动将字符串参数转换为Regexp。非常感谢您,现在这非常有意义!我肯定会回去再做一次测试,但从那以后我一直在跳过测试,现在我几乎完成了整本书,之后我会读一本关于“Rspec”的独立书,再次感谢你!你让我走上了正确的道路。:)我代表14亿中国人民向你们致以最美好的祝愿!我弄明白了为什么你找不到缺失端的语法错误。spec/support/utilities.rb中的上一个方法定义有一个额外的
end
,它看起来像是它的一部分
def full_title(page_title)
  base_title = 'Ruby on Rails Tutorial Sample App'
  if page_title.empty?
    base_title
  else
    "#{base_title} | #{page_title}"
  end