ruby-on-rails - Michael Hartl 的 Rails 教程 : Rspec's "Expected response to be a redirect to ..." is wrong

标签 ruby-on-rails ruby rspec

在 Michael Hartl 的(精彩的)Rails 教程中,我遇到了一个意外的 Rspec 测试失败的形式:

"Expected response to be a redirect to <http://test.host/signin> but was a redirect to <http://test.host/signin?notice=Please+sign+in+to+access+this+page.>."

(在第 10.3 节中找到它。)因此,从错误本身,您可以看出服务器正在重定向到适当的页面,除了有一个额外的通知“请登录”。测试代码如下所示:

describe "GET 'index'" do

describe "for non-signed-in users" do
  it "should deny access" do
    get :index
    response.should redirect_to(signin_path)
    flash[:notice].should =~ /sign in/i
  end
end

...

我是不是做错了什么?我应该如何解决这个问题?


更新:

如果我把代码改成

response.should redirect_to('http://test.host/signin?notice=Please+sign+in+to+access+this+page.')

然后我得到实际的 Ruby 错误

Failure/Error: flash[:notice].should =~ /sign in/i expected: /sign in/i, got: nil (using =~)


分辨率

问题是我的 deny_access 函数中省略了一个逗号:

redirect_to signin_path :notice => "Please sign in to access this page."

应该是

redirect_to signin_path, :notice => "Please sign in to access this page."

这修复了它。现在,这个修复的副作用很有趣,不是吗?这是否意味着 signin_path 本身是一个函数,可以将散列或参数附加到路径的末尾?古怪、狂野、美妙。

最佳答案

您的身份验证方法是什么样的?我还没有看到像以前那样将 flash 通知添加到查询字符串中:/这让我相信您的方法可能不正确。它应该是这样的:

def deny_access
  redirect_to signin_path, :notice => "Please sign in to access this page."
end

def deny_access
  flash[:notice] = "Please sign in to access this page."
  redirect_to signin_path
end

关于ruby-on-rails - Michael Hartl 的 Rails 教程 : Rspec's "Expected response to be a redirect to ..." is wrong,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4799498/

相关文章:

mysql - OSX : Library not loaded: libmysqlclient. 18.dylib 上的 rails + MySQL

ruby-on-rails - 如何使用连接表的 bool 列使 Rails/ActiveRecord 返回唯一对象

ruby-on-rails - Rails验证...多个:on options?

java - 是否有类似于 Java/C++ 上的 for-loop 的 Ruby 版本?

ruby-on-rails - NameError : undefined local variable or method `app' for - Rails 5. 1.6升级

ruby-on-rails - 访问请求规范中的请求对象

ruby-on-rails - 使用载波和雾将文件上传到 S3 时缺少要求

ruby - 访问嵌套哈希值的最佳方法

ruby-on-rails - 如何使用 dotenv 将环境变量添加到 ruby​​ on Rails 应用程序?

ruby-on-rails - 在运行 RSpec 测试时绕过 CanCan::AccessDenied