【问题标题】:Testing Rails Controller: get and post strange behavior测试 Rails 控制器:获取和发布奇怪的行为
【发布时间】:2012-09-04 17:19:59
【问题描述】:

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

在我的路线文件中:

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

一开始,我以为post会模拟一个http post 在指定的 url 请求,所以我在我的规范中写道:

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

【问题讨论】:

    标签: ruby-on-rails testing rspec controller


    【解决方案1】:

    您正在编写的是 controller 规范,而不是 request 规范。在控制器规范中,根本不参考路由,因为 rspec 直接调用控制器操作。

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

    测试login_create 操作的正确方法是使用您发现的post :login_create

    【讨论】:

    • 没关系,但是post、get、put和delete有什么区别呢?这只是一个清晰的问题吗?
    • 它在调用操作时设置正确的request.method。 (抱歉回复晚了!!)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 2020-03-31
    相关资源
    最近更新 更多