В чем преимущество Class.new в этом Rspec - PullRequest
5 голосов
/ 13 марта 2012

Я читаю некоторые Rspec, написанные кем-то, кто покинул компанию.Мне интересно об этой строке:

  let(:mailer_class) { Class.new(AxeMailer) }
  let(:mailer) { mailer_class.new }

  describe '#check' do
    before do
      mailer_class.username 'username'
      mailer.from 'tester@example.com'
      mailer.subject 'subject'
    end
    subject { lambda { mailer.send(:check) } }

Это тестирование этого класса:

class AxeMailer < AbstractController::Base

  def self.controller_path
    @controller_path ||= name.sub(/Mailer$/, '').underscore
  end

Я хочу знать разницу между этим и let(:mailer_class) { AxeMailer }.

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

Я думаю, что эта проблема началась после использования Rails 3.2, и я думаю, что name унаследован от AbstractController :: Base.

Это то же самое в консоли (то есть, это не относится к Rspec), я могу сделать AxeMailer.name без ошибок, но если я сделаю Class.new(AxeMailer), то есть проблема.

Мои вопросы:

  1. Есть ли причина использовать Class.new(AxeMailer) сверх AxeMailer
  2. Есть ли проблема, если я просто изменил это?
  3. Есть ли способ не изменить спецификацию и заставить ее пройти?

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

Полагаю, написано, что это из-за строки mailer_class.username 'username'.Если вы просто используете AxeMailer напрямую, настройка username будет перенесена между тестами.Создав новый подкласс для каждого теста, вы можете быть уверены, что между ними не передается состояние.

0 голосов
/ 13 марта 2012

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

let(:mailer) { AxeMailer.new }

describe '#check' do
  before do
    AxeMailer.username 'username'
    mailer.from 'tester@example.com'
    mailer.subject 'subject'
  end
  subject { lambda { mailer.send(:check) } }

Там просто не похожебыть потребность в анонимном классе, который был создан.Кроме того, это только мое мнение, но ваш subject выглядит немного странно.Ваша спецификация, вероятно, должна обернуть предмет в лямбду, если это необходимо, но не делайте этого в вашем subject.

Что касается ошибки, которую вы видели изначально, у анонимных классов нет имен:

1.9.3-p0 :001 > Class.new.name
 => nil 

Некоторая часть ActionMailer :: Base должна пытаться использовать имя класса для чего-либо (возможно, ведение журнала) и прерывается, когда оно равно nil.

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