Как правильно заглушить методы ассоциации Rails через mocha и test / unit? - PullRequest
4 голосов
/ 04 декабря 2010

Я работаю над приложением, в котором большая часть, если не все, данных ограничена до current_organization. Так что в моих вызовах find в моих контроллерах у меня есть такие вещи, например:

def show
  @user = current_organization.users.find(params[:id])
end

Тем не менее, в моих тестах на контроллере мне трудно найти правильный способ (или любой способ) заглушить эти вызовы, чтобы я мог проверить такие вещи, как:

get :show, :id => 1
assert_response :success

Те, которые не могут сказать, что AR не может найти пользователя с ID = 1 и organization_id = 3 "или что-то еще. Неважно, что я пытаюсь, я не могу обойти это.

Мой установочный блок выглядит примерно так:

setup do
  company = organizations(:company) # fixture
  @controller.stubs(:current_organization).returns(company)
  # now what do I stub, if anything?
end

Я пытался сделать что-то вроде: company.stubs(:users).returns([users(:one), users(:two)]), но это не сработало, потому что вызов AR find() не существует для базового массива.

Должен ли я установить массив поддельных пользователей в переменную типа fake_users, а затем сделать что-то вроде fake_users.stubs(:find).returns(@user)? Это не правильно, но, возможно, это правильный путь.

Я просто ищу лучший способ справиться с этим. Я использую mocha и test / unit, если это важно или помогает.

Спасибо!

1 Ответ

2 голосов
/ 04 декабря 2010

Если вам конкретно не нужен доступ к fake_users, я думаю, что самое простое, что вы могли бы сделать, это, вероятно, что-то вроде этого: -

company.stubs(:users => stub('users', :find => users(:one)))

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...