Можете ли вы написать заглушки / mocks / doubles для методов внутри вызова метода?

#ruby-on-rails #rspec

#ruby-on-rails #rspec

Вопрос:

Мой метод выглядит следующим образом:

 def some_method(....)

  user = User.where("....").first

  if !user.nil?

     if ..
         user.delete
     elsif
         user.update_attributes(...)

  else
     new_user = User.new(...)
     new_user.save!
  end

end
  

Как вы можете видеть, как user, так и new_user создаются внутри этого метода.

Возможно ли заглушка и макет (ожидания) для этих объектов, когда я тестирую метод?

Я пытаюсь это:

 it "should ...." do

  d = double("user double")
  d.should_receive(:save!).once

  res = User.some_method(....)

end
  

Но я получаю сообщение об ошибке, в котором говорится, что ожидалось 1 раз и получено 0 раз.

Я все делаю правильно? (очевидно, что нет, возможно ли это протестировать, поскольку я не могу передать эти заглушки / mocks тестируемому методу)

Ответ №1:

Вы можете сделать что-то вроде этого:

 user_double = double("user")
User.should_receive(:where).and_return(user_double)
user_double.should_receive(:delete)
  

Комментарии:

1. Я делаю это (см. Выше) и все еще получаю ожидаемый 1 раз, полученный 0 раз сбой / ошибка. для User.should_receive(:где).once

2. Можете ли вы опубликовать фактический код, который вы используете. Ваш приведенный выше код не содержит User.should_receive(:where).