Ruby on rails 当使用类似设计的路由时,如何在Rspec控制器测试中指定控制器和方法名称?

Ruby on rails 当使用类似设计的路由时,如何在Rspec控制器测试中指定控制器和方法名称?,ruby-on-rails,ruby,rspec,devise,Ruby On Rails,Ruby,Rspec,Devise,tl;dr:无法rspec测试设备控制器,请帮助 我正在使用Deviate,并且有以下路由(默认为路由的Deviate\u): 我想使用Rspec测试我的控制器方法是否从给定的一组参数中输出正确的输出 我的等级库文件如下所示: describe Users::RegistrationsController, type: 'controller' do it 'creates a user with given parameters' do post 'create', userna

tl;dr:无法rspec测试设备控制器,请帮助

我正在使用Deviate,并且有以下路由(默认为路由的
Deviate\u):

我想使用Rspec测试我的控制器方法是否从给定的一组参数中输出正确的输出

我的等级库文件如下所示:

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"}
这是有意义的,因为我正在为默认路由使用
design\u,正如您从
rake routes
结果中所看到的,正确的路由是
design/registrations#create
,但我似乎找不到方法将控制器名称指定为
design/registrations
。我认为它是从控制器类名或其他东西到
用户/注册
的“变形”。为了让我的测试成功,我更愿意避免弄乱我的路线。我怎样才能做到这一点?(请解释)提前谢谢

我的宝石版本:

rspec '3.2.1'
ruby '2.1.5'
rails '4.2.0'

为了能够测试从Desive继承的控制器,还需要一些额外的配置

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
:
“如果您正在测试Deave内部控制器或从Deave继承的控制器,则需要在请求之前告诉Deave应使用哪个映射。这是必要的,因为Deave从路由器获取此信息,但由于功能测试不通过路由器,因此需要明确说明。”

不确定
用户::RegistrationsController
是否正确?可能是
designe
?这是designe::RegistrationController子类的名称。如果我正在测试我的控制器子类,它不应该以它命名吗?否则我将无法测试我的控制器方法。大多数人会认为你不会测试它,因为Desive gem中已经有成千上万的测试来确保它工作。您需要做一个集成测试,以确保您可以使用capybara@Anthony这根本没用。我在网上读到的所有东西要么不完整,要么让我远离这个简单的行动。您指出,可能没有必要对其进行测试,但我不理解开发人员如何坚持独立于路由表测试控制器,但在测试控制器响应时,这正是控制器的初衷,它们迫使您返回路由,但无法明确说明是哪个控制器和操作,一切似乎都是推断出来的。是我还是那只是糟糕的设计?我相信文档在这里有误导性,但它的意思是,如果您使用的是设计模型,您应该添加设计映射语句。我得出这个结论是因为我在我的场景中测试了这一行代码,但没有任何帮助。请不要删除这篇文章,这是为了社区:)那么我相信你还有另一个问题,可能与你如何命名你的控制器有关。我已经做了很多次你想做的事情;我打赌你会找到我上面的解决方案,尽管它可能无法解决你目前遇到的任何问题,但仍然是必需的。
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