2012-04-24 35 views
1

我在我的REST Api应用程序中启动单元测试实现。 我使用versionist gemRails单元测试功能和下划线模块

所以,我有一个名为像这样的类:Api::V0_1_0::TestController

class Api::V0_1_0::TestController < Api::V0_1_0::BaseController 

    def test 
    respond_with({ 
     :message => "done" 
    }) 
    end 

end 

routes.rb(不包括所有路线,但只是必要的):

MyApp::Application.routes.draw do 

    # ----------------------------------------------------------------------------------------------------------------------------------------- 
    # ApiVersions 
    # 
    scope :module => "api", 
     :defaults => {:format => "json"} do 

    # --------------------------------------------------------------------------------------------------- 
    # V0.1.0 
    # Default version 
    # 
    api_version :module => "V0__1__0", 
       :header => "X-Version", :value => "0.1.0" do 

     # Test controller 
     get "/test" => "test#test" 
    end 
    # --------------------------------------------------------------------------------------------------- 

    # --------------------------------------------------------------------------------------------------- 
    # V0.1.1 
    # Default version 
    # 
    api_version :module => "V0__1__1", 
       :header => "X-Version", :value => "0.1.1" do 

     # Test Controller 
     get "/test" => "test#test" 

    end 
    # ----------------------------------------------------------------------------------------------------------------------------------------- 



    # ----------------------------------------------------------------------------------------------------------------------------------------- 
    # ActiveAdmin routes 
    # 
    ActiveAdmin.routes(self) 
    devise_for :admin_users, ActiveAdmin::Devise.config 
    # ----------------------------------------------------------------------------------------------------------------------------------------- 


end 

功能测试文件:

class Api::V0_1_0::TestControllerTest < ActionController::TestCase 

    test "should get test" do 
    get :test 
    assert_response :success 
    end 
end 

当我启动rake test:functionals。 我有这样的错误:

没有路由匹配{:控制器=> “API/v0_1_0 /测试”:动作=> “测试”}

当我启动rake routes,我有:

test GET /test(.:format) {:format=>"json", :controller=>"api/V0__1__0/test", :action=>"test"} 

随着V0__1__0而不是V0_1_0双下划线。

我不知道如何解决这个问题。编辑:我添加routes.rb

注:我也张贴在这里的一个问题:https://github.com/bploetz/versionist/issues/9

+0

你能发布你的routes.rb吗? – Domness 2012-04-24 13:34:12

+0

我已经编辑我的文章 – 2012-04-24 13:39:56

回答

0

Rails的功能测试(ActionController的::测试用例)是用于隔离测试控制器操作的方法。他们不通过完整的Rails堆栈,特别是Rails调度程序代码路径,这是版本师在其中执行操作的地方。

如果要测试依赖HTTP头策略的版本化API路由,请使用集成测试(ActionDispatch :: IntegrationTest)或请求规范(如果使用rspec)。

require 'test_helper' 

class Api::V0_1_0::TestControllerTest < ActionDispatch::IntegrationTest 

    test "should get test" do 
    get '/test', nil, {"X-Version" => "0.1.0"} 
    assert_response :success 
    assert_equal @response.body, "0.1.0" 
    end 
end 

Versionist 0.2.0加入集成测试/请求的规格由它的发电机(https://github.com/bploetz/versionist/issues/11)创建的组件。

0

看着你提供的链接,你可以做这样的事情?

api_version :module => "V0__1__0", 
      :path => "/V0_1_0", 
      :header => "X-Version", :value => "0.1.0" do 

或者

get "/test" => "test#test", :controller => "api/V0_1_0/test" 
+0

是的,这一行做一个范围,如: 'scope:module =>“v0__1__0”'。 (cf:https://github.com/bploetz/versionist) – 2012-04-24 13:45:54

+0

我已经更新了答案,看看是否有其他更改。 – Domness 2012-04-24 13:54:05

+0

第二个选项可以运行。但是在gem自述文件中写道:“如果你想简单地用下划线代替点,你需要在传递给api_version的模块名称中使用两个下划线(即__)来解决Rails的变形器中的一个怪癖。” – 2012-04-24 14:06:34