Следите за классами одного и того же пространства имен

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

allow(SibApiV3Sdk::SendSmtpEmail).to receive(:new).and_return(seb_send_email)
allow(SibApiV3Sdk::SMTPApi).to receive(:new).and_return(seb_smtp_api)

def seb_send_email
  @seb_smtp_api ||= SibApiV3Sdk::SendSmtpEmail.new(email_params)
end

def seb_smtp_api
  @seb_smtp_api ||= SibApiV3Sdk::SMTPApi.new
end

Когда я это делаю, второй шпион не работает должным образом и возвращает первый шпионский объект. Я подозреваю, что это как-то связано с классом пространства имен. Это ожидаемое поведение и есть ли альтернативный подход для обработки шпионов классов в пространстве имен?

1 ответ

Решение

Вы назначаете оба @seb_smtp_api переменная, и это источник ваших проблем.

Вы, вероятно, называете seb_send_email метод, затем он запоминается как @seb_smtp_api и когда вы звоните seb_smtp_api он просто возвращает запомненное значение.

Вы можете проверить это, заменив allow с expect и посмотри что SibApiV3Sdk::SMTPApi"s new метод никогда не вызывается.

Другие вопросы по тегам