我正在使用Devise的Rails网站上进行功能测试,我遇到了一个奇怪的问题。我需要弄清楚如何模拟登录,经过一些搜索,我发现this question告诉了我关于Devise :: TestHelpers和sign_in函数的信息。但奇怪的是,它在一些但不是我的所有测试中都有效。这是我的几个测试:
include Devise::TestHelpers
setup do
@game = games(:game_one)
@user = users(:one)
sign_in(@user)
end
# This test passes
test "should get index" do
get :index
assert_response :success
assert_not_nil assigns(:games)
end
# This test fails; the post redirects to /users/sign_in
# as if accessed without logging in
test "should create game" do
assert_difference('Game.count') do
post :create, game: { name: @game.name }
end
assert_redirected_to game_path(assigns(:game))
end
控制器本身看起来像这样:
class GamesController < ApplicationController
before_filter :authenticate_user!
# Some mostly-autogenerated CRUD
end
据我所知,正在运行的测试与我认为尚未登录的测试之间的主要区别在于前者使用get
而后者post
。这是有道理的吗?我该如何解决?
编辑:这与Devise自述提及的“范围”有关吗?它并没有真正解释这意味着什么,但似乎它可能是相关的。
答案 0 :(得分:0)
啊哈!感谢farleyknight的评论,我发现它抱怨CSRF令牌的真实性。从那里,this question有一个有效的解决方案。我将它添加到我的ApplicationController:
skip_before_filter :verify_authenticity_token if Rails.env.test?
作为测试的一部分,可能有一种方法可以实际发送有效的CSRF令牌,这可能是一个更好的解决方案,但这个对我有用。