request.fullpath с RSpec - PullRequest
       2

request.fullpath с RSpec

0 голосов
/ 03 июня 2011

В моем контроллере приложений у меня есть пара методов, определенных следующим образом:

def store_location
  session[:return_to] = request.fullpath
end

def redirect_back_or_default(default)

  # make sure this method doesn't redirect back to the current page
  if session[:return_to] == request.fullpath
    redirect_to default
  else
    redirect_to(session[:return_to] || default)
  end

  session[:return_to] = nil
end

Чтобы протестировать эти методы, мне нужно найти способ установить request.fullpath в RSpec.Кто-нибудь знает, как я могу это сделать?

Обновление

При тестировании этих методов я использую общую группу примеров, например так:

shared_examples_for "redirect back or default" do
  it "should redirect" do
    request
    response.should be_redirect
  end

  describe "when the user has a back page" do
    it "should redirect to back"
  end

  describe "when the user does not have a back page" do
    it "should redirect to default" do
      request
      response.should redirect_to(default_path)
    end
  end
end

При включении групп общих примеров я делаю что-то вроде следующего:

before(:each) do
  def request
    post :create, :user => @attr
  end
  def default_path
    :root
  end
end

include_examples "redirect back or default"

Таким образом, когда метод использует redirect_back_or_default, мне просто нужно добавить приведенный выше код в его тесты, и яготово. Таким образом, я все еще могу говорить конкретно о тестировании redirect_back_or_default без необходимости тестирования на реализацию, что кажется мне лучшим способом сделать BDD.

1 Ответ

0 голосов
/ 07 июня 2011

У вас есть доступ к объекту @request, который вы можете установить напрямую, например:

@request.fullpath = "/my/path"

Я предполагаю, что это будет переопределено, когда вы сделаете ваш фактический get / post / put / delete, однако, в спецификации контроллера.

Любая причина, по которой вы хотите установить полный путь напрямую, а не знать, что полный путь будет просто чем-то простым, например "/ mock"?

class MocksController < ApplicationController
  def show
  end
end

describe MocksController do
  before do
    MyApp::Application.routes.draw do
      resource :mock, :only => [:show]
    end
  end

  after do
    Rails.application.reload_routes!
  end

  it "something" do
    get :show
    should # something
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...