Подтвердить что ты не робот

В чем разница между mock и mock_model в RSpec

Недавно я познакомился с различными учебниками, в которых люди используют функции mock и mock_model.

В учебном пособии RSpec для контроллеров они используют функцию mock_model, но прямо в документация RSpec существует только mock, но mock_model

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

4b9b3361

Ответ 1

Как сказал jenger, mock_model - это расширение, созданное для активной записи:

Это источник в 1.2.6:

     def mock_model(model_class, options_and_stubs = {})
        id = options_and_stubs[:id] || next_id
        options_and_stubs = options_and_stubs.reverse_merge({
          :id => id,
          :to_param => id.to_s,
          :new_record? => false,
          :errors => stub("errors", :count => 0)
        })
        m = mock("#{model_class.name}_#{id}", options_and_stubs)
        m.__send__(:__mock_proxy).instance_eval <<-CODE
          def @target.as_new_record
            self.stub!(:id).and_return nil
            self.stub!(:to_param).and_return nil
            self.stub!(:new_record?).and_return true
            self
          end
          def @target.is_a?(other)
            #{model_class}.ancestors.include?(other)
          end
          def @target.kind_of?(other)
            #{model_class}.ancestors.include?(other)
          end
          def @target.instance_of?(other)
            other == #{model_class}
          end
          def @target.class
            #{model_class}
          end
        CODE
        yield m if block_given?
        m
      end

Так что его довольно глоток, но он

  • заглушает идентификатор со следующим в последовательности
  • заглушки to_param
  • stubs new_record? с ложным
  • ошибки в записях, поэтому он считает, что ошибок нет.

Он также расширяет экземпляр модели множеством вещей.

Ответ 2

От: Полезные помощники для RSpec mocks

Во-первых, mock_model автоматически определяет уникальные идентификаторы для моделей, которые были созданы с его помощью. Во-вторых, это определяет методы to_param (возвращает строковое представление идентификатора) и new_record? (возвращает false).