Rspec mock_model не доступен в экземпляре объекта? - PullRequest
0 голосов
/ 03 ноября 2010

У меня есть этот код в модели под названием Project. Он устанавливает владельца проекта до его сохранения.

before_save :set_owner

# Set the owner of the project right before it is saved.
def set_owner
  self.owner_id = mock_model(User).id # current_user.id is stubbed out for a mock_model.
  # Lifecycle is set by the form's collection_select
end

И функция current_user отключена в моих тестах Rspec, чтобы вернуть mock_model (именно поэтому код выше показывает mock_model вместо current_user).

Теперь, когда я запускаю это, мои тесты Rspec срываются и жалуются:

undefined method `mock_model' for #<Project:0x105c70af0>

Я предполагаю, что поскольку before_save является функцией экземпляра, он почему-то считает, что mock_model - это функция, определенная в Project.

Кто-то, должно быть, сталкивался с этим раньше ... Как-нибудь обойтись?

1 Ответ

2 голосов
/ 03 ноября 2010

Сразу выделяются две вещи:

  1. Вы не должны использовать mock_model в вашей реальной модели проекта.Весь тестовый код должен оставаться в спецификации.

  2. Вы не можете передать объект current_user из контроллера в модель (по крайней мере, никак).

Я бы использовал attr_accessor в вашей модели проекта для установки идентификатора current_user.

class Project < AR::Base
  attr_accessor :current_user

  def set_owner
    self.owner_id = current_user.id unless current_user.nil?
  end
end

Тогда ваша спецификация должна выглядеть примерно так:

it "should set the owner id" do
  user = mock_model(User)
  project = Project.new
  project.current_user = user
  project.save
  project.owner_id.should == user.id
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...