Тестирование действия контроллера RSpec, к которому нет прямого доступа - PullRequest
3 голосов
/ 19 ноября 2010

У меня есть контроллер, к которому нельзя получить прямой доступ традиционным способом RESTful, а только через определенный URL.

Обычно я привык использовать get и post в моих спецификациях контроллера для вызова действий контроллера. Есть ли способ, которым я могу тренировать свой контроллер, посещая определенный URL?

EDIT:

Вот мой маршрут:

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

1 Ответ

7 голосов
/ 19 ноября 2010

Тесты контроллера используют четыре HTTP-глагола (GET, POST, PUT, DELETE), независимо от того, является ли ваш контроллер RESTful. Так что если у вас есть маршрут без 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

оба пройдут, так как маршрут принимает любой глагол.

EDIT

Я думаю, вы смешиваете тесты контроллера и тесты маршрута. В тесте контроллера вы хотите убедиться, что логика действия работает правильно. В тесте маршрута вы проверяете, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...