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)?
答案 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,用于直接测试路由到达的路径。