1

在我的控制器规格之一中获得非常奇怪的 rspec 行为。

最好能说明。在 ruby​​mine 中,当我设置断点时,会发生这种情况:

#rspec test
describe Api::V1::UsersController do
  let(:user) { FactoryGirl.create(:user) }
  describe "#show" do
    it "responds successfully" do
      get 'show', id: user.id
      response.should be_success
    end
end

#controller
class Api::V1::UsersController < AuthenticatedController
    def show # !!! RubyMine breakpoint will stop execution here !!!
      user = User.find(params[:id])
      user_hash = User.information(user, current_user)

      respond_to do |format|
        format.json { render json: user_hash.to_json }
      end
end

所以上面的工作按预期工作。

但是,现在这个测试失败了。

#rspec test
describe UsersController do
  let(:user) { FactoryGirl.create(:user, is_admin: false) }
  describe "#show" do
    it "redirects non-admin" do
      get 'index'
      response.should redirect_to user_path(user)
    end
end

#controller
class UsersController < AuthenticatedController
  def index # !!! Breakpoint is never hit !!!
    @users = User.all
    respond_to do |format|
      if current_user.is_admin
        format.html
        format.json { render json: @users }
      else
        redirect_to user_path(current_user) and return
      end
    end
end
By the way, this is the result:
Expected response to be a redirect to <http://test.host/users/625> but was a redirect to <https://test.host/users>

我在 UsersController 中的控制器方法中没有一个断点被命中。但是如果我在 API::V1::UsersController 中设置断点,所有控制器方法都会被命中。

非常感谢任何指导。我真的不知道如何调试它。

4

2 回答 2

2

对不起,这个问题比什么都更令人沮丧。但我终于弄清楚发生了什么。提示: tail测试 test.log 是个好主意。

我在控制器上强制使用 ssl。发送的请求 rspec 是 http。 ActionController::ForceSSL将请求重定向到 https 和同一个控制器#action。但是,此时,rspec 测试已完成并且测试失败,因为它只看到重定向回相同的控制器#action。

所以在 abefore(:each)或类似的东西中,使用这个: request.env['HTTPS'] = 'on'。现在所有测试都按预期工作。

于 2013-02-03T23:43:01.607 回答
1

我想也许你在重定向测试方面超出了 rspec 的领域。我可以建议使用 capybara 和 rspec 吗?

我的资料来源: Rspec - Rails - 如何遵循重定向 http://robots.thoughtbot.com/post/33771089985/rspec-integration-tests-with-capybara

于 2013-02-03T01:09:30.550 回答