在Ruby on Rails中测试非资源操作

时间:2011-01-21 15:28:47

标签: testing ruby-on-rails-3 routing

我在config / routes.rb文件中添加了以下内容:

match 'login' => 'sessions#new'
match 'logout' => 'sessions#destroy'
match 'auth/:provider/callback' => 'sessions#create'
match 'auth/failure' => 'sessions#new'
match 'sessions/delegate' => 'sessions#delegate'

这允许我拥有自己的自定义登录表单,在这种情况下通过OmniAuth和OpenID提供程序进行身份验证。路由和代码运行良好,但我在为SessionsController编写功能测试时遇到问题。

测试新动作效果很好:

test "show login form when requesting new session" do
  get :new
  assert_response :success
end

但是测试create动作会给我一个异常:ActionController :: RoutingError:没有路由匹配{:controller =>“sessions”,:action =>“create”}

代码是这样的:

test "create session adds logged in user" do
  request.env['rack.auth'] = {:uid => auths(:one).open_id, :provider => 'open_id'}
  post :create
  # assert that create action did it's things here
end

我试图用get替换帖子,但结果是一样的。 为什么找到一个动作,而不是另一个?

1 个答案:

答案 0 :(得分:0)

大概是因为你没有从匹配模式提供:provider key而感到困惑。您可能会发现为这些非资源路由指定名称更加清晰,例如:

match 'auth/:provider/callback' => 'sessions#create', as: 'callback'

这样您就可以在考试中post callback_path(provider: whatever)我认为: - )