tl; dr:无法对设备控制器进行rspec测试,帮助。
我正在使用Devise并拥有以下路由(默认devise_for
路由):
GET /users/cancel(.:format) devise/registrations#cancel
POST /users(.:format) devise/registrations#create
GET /users/sign_up(.:format) devise/registrations#new
GET /users/edit(.:format) devise/registrations#edit
PATCH /users(.:format) devise/registrations#update
PUT /users(.:format) devise/registrations#update
DELETE /users(.:format) devise/registrations#destroy
我想使用Rspec测试我的控制器方法是否从给定的一组参数中吐出正确的输出。
我的spec文件如下所示:
describe Users::RegistrationsController, type: 'controller' do
it 'creates a user with given parameters' do
post 'create', username: 'jonsnow', password: '012345678912345', authenticity_token: '12345'
expect(response.status).to eq(200)
end
end
我得到的错误是:
Failure/Error: post 'create', username: 'jonsnow', password: '012345678912345', authenticity_token: '12345'
ActionController::UrlGenerationError:
No route matches {:action=>"create", :controller=>"users/registrations"}
这是有道理的,因为我使用的是devise_for
默认路由,正如您从rake routes
结果中看到的那样,正确的路由是devise/registrations#create
,但我似乎无法找到将控制器名称指定为devise/registrations
的方法。我认为它是从控制器类名称'变形'或users/registrations
。我最好避免弄乱我的路线,以使我的测试成功。我怎么能做到这一点? (请解释)先谢谢。
我的宝石版本:
rspec '3.2.1'
ruby '2.1.5'
rails '4.2.0'
答案 0 :(得分:-3)
需要一些额外的配置才能测试从Devise继承的控制器。
describe YourControllerWhichInheritsDevise, type: 'controller' do
before do
@request.env["devise.mapping"] = Devise.mappings[:user]
end
it 'creates a user with given parameters' do
post 'create', username: 'jonsnow', password: '012345678912345', authenticity_token: '12345'
expect(response.status).to eq(200)
end
end
From the Devise README: "如果您正在测试Devise内部控制器或继承自Devise的控制器,您需要告诉Devise在请求之前应该使用哪个映射。这是必要的,因为Devise从路由器获取此信息,但由于功能测试不通过路由器,因此需要明确说明。"