测试Rails控制器:获取并发布奇怪的行为

时间:2012-09-04 17:20:00

标签: ruby-on-rails testing rspec controller

我正在使用RSpec(通过gem rspec-rails)进行测试和开发 我的应用程序。 我试图“测试”一个控制器并遇到一个奇怪的post和get方法行为(对于所有其他类似的行为都是如此)。

在我的路线档案中:

controller :sessions do
    post '/login',  action: :login_create
    get  '/login',  action: :login
    get  '/logout', action: :logout
end

一开始,我认为帖子会模拟一个http帖子 请求指定的网址,所以我在我的规范中写道:

describe "POST 'login'" do
    it "returns http success" do
        post 'login'
        response.should be_success
        response.should render_template 'sessions/login_create'
    end
end

但是这将调用登录操作,而不是login_create,然后最后一个断言失败。 经过大量的谷歌搜索和实验后,我用post 'login'更改了post :login_create,这实际上有效! 奇怪的是,如果我用post更改get,它将继续有效! O_O 这不奇怪吗?这些方法如何工作和使用?

在Rails API中,我找不到除课程以外的任何内容:ActionController::TestCase::Behavior

1 个答案:

答案 0 :(得分:1)

您正在撰写的是控制器规范,而不是请求规范。在控制器规范中,根本不查询路由,因为rspec直接调用控制器操作。

当您编写post 'login'时,login指定操作名称,而不是URL路径。

测试login_create操作的正确方法是使用post :login_create,因为您已经发现。