Проверка того, что объект принадлежит или создан current_user - PullRequest
2 голосов
/ 30 марта 2012

В настоящее время я пытаюсь создать приложение dropbox-esque из учебника, и у меня возникают проблемы при попытке выяснить, как я буду тестировать этот контроллер.

это страница AssetsController

    def index
       @assets = current_user.assets
    end

    def show
       @assets = current_user.assets.find(params[:id])

Кроме того, assets own_to: пользователь и пользователь has_many: assets

Как бы я включил это в тест rspec?

Ответы [ 2 ]

3 голосов
/ 30 марта 2012

Во-первых, будьте очень осторожны с AssetsController.

Предполагая, что вы используете Rails 3, "assets_path" также является путем, используемым для загрузки активов вашего приложения, и, следовательно, все, что вы записываете в сеанс в этом контроллере, будет игнорироваться без уведомления. Наверное, не то, что вы хотите! Я бы настоятельно рекомендовал переименовать контроллер.

Я бы сначала создал пользователя в блоке входа

module ControllerMacros
  def login_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      @user = Factory.create(:user)
      sign_in @user
    end
  end
end

Затем вы можете загрузить это в файл spec_helper.rb

RSpec.configure do |config|
  config.include Devise::TestHelpers, :type => :controller
  config.extend ControllerMacros, :type => :controller
end

Наконец, вы можете использовать это в тесте

describe MyController do
  context "#index" do
    login_user
    before(:each) do
      @assets = []
      5.times{ @assets << Factory.create(:asset, :user => @user)}
    end

    it "should test index" do
      get :index
      assigns(:assets).should eq(@assets)
    end
  end
end

Теперь, это должно правильно проверить ваш список активов.

РЕДАКТИРОВАТЬ: Только что понял, я использую FactoryGirl / Devise здесь, вы можете или не можете!

1 голос
/ 30 марта 2012

Что именно у вас вопрос? Как настроить базовые тесты для отношений или как проверить управление current_user?

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

Я обычно проверяю это так:

1) определить приборы (или поочередно использовать что-то вроде FactoryGirl) для двух пользователей и некоторых ресурсов (три для этого примера). активы для пользователя a называются asset_a_ *, активы для пользователя b asset_b _ *)

2) Тест просто такой:

   users(:users_a).assets.should have(3).records
   users(:users_a).assets.should include(assets(:asset_a_a))
   users(:users_a).assets.should include(assets(:assets_a_b))
   users(:users_a).assets.should include(assets(:assets_a_c))

Вы можете настроить это как users (: users_a) .assets.find (assets (: asset_a_a) .id). должны включать (assets (: asset_a_a)) users (: users_a) .assets.find (assets (: asset_a_a) .id) .should_not include (assets (: asset_b_a))

Если вы абсолютно хотите, вы можете использовать аналогичные тесты для части контроллера.

Хотя довольно много дискуссий о том, нужно ли вообще тестировать такую ​​базовую функциональность, поскольку в основном это базовая функциональность Rails для обработки ассоциаций, которые вы определили в вашей модели.

Лично я делаю такое тестирование по некоторым причинам. Во многих случаях такие ассоциации, связанные с разрешениями, вскоре становятся более сложными и в любом случае нуждаются в подробных тестах. или кто-то может изменить параметры ассоциации и что-то сломать.

II - О части current_user в контроллере.

Конечно, это зависит от того, как вы обрабатываете аутентификацию для начала. Если вы используете плагин, такой как AuthLogic (или любой другой), он может иметь несколько методов, которые позволяют имитировать вход в систему в rspec. Для authlogic вы можете сделать что-то вроде этого:

before(:each) do
  activate_authlogic
  UserSession.create(users(:user_a))
end

Это активирует authlogic и 'login' user_a. Затем вы запускаете свой контроллер

  get :index
  response.should be_success
  response.should render_template :index
  assigns(:assets).should # => more or less as above, check that there are the right aessets.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...