Spork вызывает неопределенную ошибку метода в моем приложении Rails? - PullRequest
5 голосов
/ 19 марта 2012

У меня есть стандартное приложение Rails 3.2 с некоторым странным поведением.

Я могу запустить rspec spec/ без запуска Spork, и все тесты пройдут без проблем.

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

Failures:

  1) InvitationsController GET accept with non-matching token should redirect to the root path
     Failure/Error: let!(:invitation) { Factory :invitation }
     NoMethodError:
       undefined method `invite' for InvitationMailer:Class
     # ./app/models/invitation.rb:29:in `send_email'
     # ./spec/controllers/invitations_controller_spec.rb:5:in `block (3 levels) in <top (required)>'

Тогда, чтобы сделать все это немного страннее, я могу запускать отдельные каталоги или спецификации, с или без запуска spork, и все проходит без проблем. например, rspec spec/mailers или rspec spec/models.

Вот метод, который мне говорят, не определен:

class InvitationMailer < ActionMailer::Base
  default from: APP_CONFIG[:default_from]

  def invite(invitation)
    @invitation = invitation

    mail(to: @invitation.recipient_email, subject: "the subject")
  end
end

Есть идеи, что может произойти?

1 Ответ

0 голосов
/ 22 ноября 2012

Потратив некоторое время на настройку Spork, я думаю, что это можно исправить.

По какой-то причине Spork не загружает файл InvitationMailer. Итак, единственное, что вы можете сделать, это потребовать это в блоке Spork.each_run do.

Кроме того, вот процесс, который я использовал для диагностики проблем Spork:

  1. Переместить все в помощнике спецификаций, кроме require 'spork', внутрь блока Spork.prefork do. Убедитесь, что нет ошибок. Используйте time, чтобы увидеть, как быстро.
  2. Переместить некоторый код в блок Spork.each_run do.
  3. Проверьте, не произошла ли ошибка. Используйте time, чтобы увидеть, как быстро выполняются тесты.
  4. Проверьте, не произошла ли ошибка. Если это так, переместите некоторый код обратно на pre_fork.
  5. Продолжайте перемещать вещи, пока не поймете, что должно быть в блоке prefork и насколько быстрее он работает.

Этот процесс был объяснен в этом RailsCast .

...