Как правильно использовать фиктивную функциональность для тестирования в Rails? - PullRequest
1 голос
/ 20 июля 2011

Я новичок в использовании mixins, и я более знаком с внедрением зависимостей на основе Java.

Допустим, я использую модуль mixin для обеспечения подключения к базе данных для класса, как описано в http://fabiokung.com/2010/05/06/ruby-and-dependency-injection-in-a-dynamic-world/:

module ConnectionProvider
  def connection
    # open a database connection and return it
  end
end

# reopening the class to mix the module in
class Repository
  include ConnectionProvider
end

Это позволяет мне сделать это:

class Repository
  def find(id)
    connection.execute("SELECT ...")
  end
end

Теперь мне не нужно передавать объект ConnectionProvider через инициализатор репозитория.

* 1012Допустим, я хочу использовать фиктивную версию ConnectionProvider для целей тестирования, и поэтому я хочу включить MockConnectionProvider в репозиторий вместо ConnectionProvider.И ConnectionProvider, и MockConnectionProvider предоставляют метод соединение .Вот как я думаю, это должно быть сделано.

Для моего обычного приложения на Rails

В environment.rb:

require File.dirname(__FILE__) + "/../lib/repository"

Для моих тестовых сценариев

В моих тестовых файлах:

require File.dirname(__FILE__) + "/../lib/repository_mocked"

Это правильно?Если нет, то может ли кто-нибудь предоставить ссылку на статью, демонстрирующую правильный путь?

Ответы [ 2 ]

1 голос
/ 20 июля 2011

Вы должны использовать насмешливую библиотеку, чтобы делать подобные вещи. Я обычно использую mocha , который имеет хороший интерфейс, с этим вы можете написать код, подобный

mocked_value = # anything you want
Repository.any_instance.stubs(:find).returns(mocked_value)

Таким образом, каждый вызов Repository#find будет возвращать mocked_value

Другие библиотеки насмешек:

0 голосов
/ 20 июля 2011

Вы можете просто смоделировать метод 'connection'.

Поскольку модуль включен в класс, его методы рассматриваются как методы этого класса.

Если вы хотите смоделироватьмножество связанных методов, которые вы можете переписать в своем классе, например, используя экземпляр класса ConnectionProvider (да, измените его на класс из модуля).Таким образом, вы можете смоделировать этот объект экземпляра ConnectionProvider.

UPD: вы не должны связываться с файлами для насмешек.Используйте специальные инструменты для насмешек, как сказал вам Фабио.;)

...