ruby-on-rails – 测试无法直接访问的RSpec控制器操作

我有一个无法直接访问的控制器,采用传统的RESTful方式,而只是通过特定的URL.

通常我习惯在我的控制器规范中使用get和post来调用控制器动作.有没有办法通过访问特定网址来运用我的控制器?

编辑:

这是我的路线:

Larzworld::Application.routes.draw do

  match '/auth/:provider/callback' => 'authentications#create'

  devise_for :users,:controllers => {:registrations => "registrations"} 

  root :to => 'pages#home'
end

这是我的规格:

require 'spec_helper'

describe AuthenticationsController do

before(:each) do
  request.env["omniauth.auth"] = {"provider" => "twitter","uid" => "12345678"} 
end

describe 'POST create' do

  it "should find the Authentication using the uid and provider from omniauth" do
    Authentication.should_receive(:find_by_provider_and_uid)
    post 'auth/twitter/callback'
  end
end

end

这是我收到的错误:

Failures:
  1) AuthenticationsController POST create should find the Authentication using the uid and provider from omniauth
    Failure/Error: post 'auth/twitter/callback'
    No route matches {:action=>"auth/twitter/callback",:controller=>"authentications"}
    # ./spec/controllers/authentications_controller_spec.rb:13

Finished in 0.04878 seconds
1 example,1 failure

解决方法

无论您的控制器是否为RESTful,控制器测试都使用四个HTTP谓词(GET,POST,PUT,DELETE).所以如果你有一个非RESTful路由(Rails3):

match 'example' => 'story#example'

这两个测试:

require 'spec_helper'

describe StoryController do

  describe "GET 'example'" do
    it "should be successful" do
      get :example
      response.should be_success
    end
  end

  describe "POST 'example'" do
    it "should be successful" do
      post :example
      response.should be_success
    end
  end

end

将通过,因为路线接受任何动词.

编辑

我认为你正在混淆控制器测试和路由测试.在控制器测试中,您要检查操作的逻辑是否正常工作.在路由测试中,您检查URL是否转到正确的控制器/操作,并且正确生成了params哈希.

因此,要测试您的控制器操作,只需执行:

post :create,:provider => "twitter"`

要测试路由,请使用params_from(对于Rspec 1)或route_to(对于Rspec 2):

describe "routing" do
  it "routes /auth/:provider/callback" do
    { :post => "/auth/twitter/callback" }.should route_to(
      :controller => "authentications",:action => "create",:provider => "twitter")
  end
end

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...