在我的某个控制器规范中获得非常奇怪的rspec行为。
最好说明一下。在rubymine中,当我设置断点时,会发生这种情况:
#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中设置断点,那么所有控制器方法都会被命中。
非常感谢任何指导。我真的不知道如何调试它。
答案 0 :(得分:2)
对不起,这个问题更多的是出于挫折而不是任何事情。但我终于弄清楚发生了什么。提示:tail
test.log是一个好主意。
我在控制器上强制ssl。 rspec发送的请求是http。 ActionController::ForceSSL
将请求重定向到https并重定向到同一控制器#action。但是,此时,rspec测试已完成并且测试失败,因为它只看到重定向回到相同的控制器#action。
因此,在before(:each)
或类似内容中,请使用此request.env['HTTPS'] = 'on'
。所有测试现在按预期工作。
答案 1 :(得分:1)
我想在重定向测试方面,你可能会在这里超越rspec领域。我可以建议使用水豚和rspec吗?
我的消息来源: Rspec - Rails - How to follow a redirect http://robots.thoughtbot.com/post/33771089985/rspec-integration-tests-with-capybara