rspec输出中的rails omniauth错误

Ian*_*ney 5 facebook rspec ruby-on-rails omniauth

我有一个使用devise/omniauth的rails 4应用程序允许通过facebook登录.该应用程序似乎工作,测试似乎也有效.但是,我有一个测试,用于检查用户通过Facebook登录的情况,但决定不授予权限.

此测试正常工作,但会向rspec输出发送错误消息

$ rspec -fd --tag inspect 
Sign in with facebook
  new user
E, [2013-10-20T21:25:24.232573 #17137] ERROR -- omniauth: (facebook) Authentication failure! invalid_credentials encountered
    does not grant permission

Finished in 0.21152 seconds
1 example, 0 failures

Randomised with seed 52495
Run Code Online (Sandbox Code Playgroud)

要么

$ rspec 
....E, [2013-10-20T21:25:24.232573 #17137] ERROR -- omniauth: (facebook) Authentication failure! invalid_credentials encountered.
............................................................

Finished in 0.95531 seconds
74 examples, 0 failures

Randomized with seed 2946
Run Code Online (Sandbox Code Playgroud)

相关测试

require 'spec_helper.rb'

feature "sign in with facebook" do
  context "new user" do
    scenario "does not grant permission", inspect: true do
      dont_sign_in_with_facebook
      expect(notice_area).to have_content "Could not authenticate you from Facebook because \"Invalid credentials\""
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

和authentication_helper

module Features
  module AuthenticationHelpers
    def dont_sign_in_with_facebook
      OmniAuth.config.test_mode = true
      OmniAuth.config.mock_auth[:facebook] = :invalid_credentials
      visit "/users/auth/facebook"
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我可以做些什么来抑制rspec输出的错误信息?

编辑

我尝试实现@Shepmaster描述的沉默功能,但没有解决问题.然后尝试重定向rspec命令中的错误:

rspec -fd --tag inspect  2> /dev/null
Sign in with facebook
  new user
E, [2013-10-20T21:25:24.232573 #17137] ERROR -- omniauth: (facebook) Authentication failure! invalid_credentials encounterd
    does not grant permission

Finished in 0.21152 seconds
1 example, 0 failures

Randomised with seed 65190
Run Code Online (Sandbox Code Playgroud)

并重定向stdout

rspec -fd --tag inspect  > /dev/null
Run Code Online (Sandbox Code Playgroud)

没有输出!

最后使用输出选项

rspec -fd --tag inspect -o /tmp/rspec.out 2> /dev/null
cat /tmp/rspec.out 

Sign in with facebook
  new user
    does not grant permission

Finished in 0.21152 seconds
1 example, 0 failures

Randomised with seed 65190
Run Code Online (Sandbox Code Playgroud)

答案 使用@shepmaster的答案

module Features
  module AuthenticationHelpers
    def dont_sign_in_with_facebook
      OmniAuth.config.test_mode = true
      OmniAuth.config.mock_auth[:facebook] = :invalid_credentials
      silence_omniauth {visit "/users/auth/facebook"}
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

Abe*_*ker 10

我在Rails 4.2应用程序中遇到了同样的问题.解决方法是根据README将OmniAuth记录器设置为初始化程序中的Rails记录器:

# config/initializers/omniauth.rb
OmniAuth.config.logger = Rails.logger
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案 - 确切地说OP没有一堆复杂的测试设置.另外,正确设置记录器有助于调试开发和生产中的问题,因为错误实际上最终会出现在日志中而不是STDOUT或STDERR中. (5认同)

She*_*ter 6

最好的办法是找到打印该错误的代码,然后你就可以弄清楚是否存在一种消除该错误的精确方法.

该错误消息具有唯一的拼写错误(encountertererd),它在设计源中似乎没有发生(或曾经发生过).也许它来自你的代码或其他宝石?快速github搜索没有任何有用的结果.

添加

您似乎没有完全复制并粘贴错误,所以我一直在寻找一个永远不会发生的字符串!这是错误来源.您应该能够在测试期间将OmniAuth记录器设置为其他记录器.这与silence下面的风格相同:

def silence_omniauth
  previous_logger = OmniAuth.config.logger
  OmniAuth.config.logger = Logger.new("/dev/null")
  yield
ensure
  OmniAuth.config.logger = previous_logger
end
Run Code Online (Sandbox Code Playgroud)

原版的

如果找不到消息的来源,则始终存在核选项:在该测试期间完全禁用打印到标准输出流.这个其他的SO问题有一个如何做的例子,我将在这里修改和复制:

def silence
  previous_stdout, $stdout = $stdout, StringIO.new
  previous_stderr, $stderr = $stderr, StringIO.new
  yield
ensure
  # Restore the previous values of stdout and stderr
  $stdout = previous_stdout
  $stderr = previous_stderr
end

# And in your test
it 'does whatever' do
  silence { code.that_causes.the_warning }
end
Run Code Online (Sandbox Code Playgroud)

重申一下,找到一个更窄的解决方案好得多.当测试期间打印出调试信息并且什么也看不见时,沉默stdout/stderr无疑会让人感到困惑.我这样说就是因为它发生在我上周这一次.:-)