如何在RSpec控制器规范中调用另外两个类似的路由?

时间:2016-05-26 14:14:07

标签: ruby-on-rails ruby rspec rspec-rails

Rails 4.1.8
Rspec 3.4.4

鉴于有2条路线,我很难理解如何调用它们。

路线a)/data_services/add_comment/:id
路线b)/data_services/:id/add_comment

在services_controller_spec.rb

describe 'create comment' do
  let!(:service) { FactoryGirl.create(:service) }

  describe 'with valid comment' do
    it 'creates a new comment' do
      expect {
        post :add_comment, id: service.id
      }.to change(service.service_comments, :count).by(1)

      expect(response).to redirect_to(service_path(service))
    end
  end
end

我相信使用此代码我的测试是引用路由a)。我如何参考路线b)?

1 个答案:

答案 0 :(得分:1)

当您在rspec-rails控制器规范中调用操作时,您没有调用路由,而是直接调用控制器和操作。传递控制器名称的<int:json-to-object-transformer>块告诉rspec-rails类名,并且传递给using (var inFileSteam = new FileStream(@"C:\path\to\file.bin", FileMode.Open)) { byte[] buffer = new byte[5 * 1024 * 1024]; // 5MB in bytes is 5 * 2^20 int bytesRead = inFileSteam.Read(buffer, 0, buffer.Length); while (bytesRead > 0) { for (int i = 0; i < bytesRead; i++) { if (buffer[i] == 0x28) // 0010 1000 in binary { // replace for example or any other manipulation buffer[i] = 0x00; } } outFileStream.Write(buffer, 0, bytesRead); bytesRead = inFileSteam.Read(buffer, 0, buffer.Length); } } describe调用的操作名称告诉rspec-rails方法名称。它只是实例化控制器类并直接调用该方法。

但是,当调用action方法时,Rails确实会查找到该控制器和操作的路由,并出于几个偶然的原因使用它,例如在post中构造URI。当然,使用的路线取决于路线文件中的内容。

因此,要在控制器规范中运行给定路线,请调用路径路由到的控制器和操作。

请注意,rspec-rails也有routing specs,用于直接测试路由到达的路径。