Как реально сбросить юнит-тест? - PullRequest
2 голосов
/ 31 марта 2011

Я хотел бы проверить класс и загрузку драгоценных камней.Взгляните на следующий глупый тестовый пример:

require 'rubygems'
require 'shoulda'

class SimpleTest < Test::Unit::TestCase

    context 'This test' do

       should 'first load something' do
           require 'bundler'

           assert Object.const_defined? :Bundler
       end

       should 'second have it reset again' do
           assert !Object.const_defined?(:Bundler)
       end

       teardown do
         # This works, but is tedious and unclean
         #Object.send :remove_const, :Bundler rescue nil

         # Instead I want something like this ;)
         magic_reset
       end

    end

end

Ответы [ 4 ]

3 голосов
/ 13 мая 2011

Как насчет создания подкласса Test::Unit::TestCase, который запускает тестовый метод в разветвленном процессе?

class ForkingTestCase < Test::Unit::TestCase
  def run(...)
    fork do
      super.run(...)

      # somehow communicate the result back to the parent process
      # this is the hard part
    end
  end  
end

Если это можно реализовать, тогда нужно просто изменить базовый классваш тестовый пример.

2 голосов
/ 31 марта 2011

AFAIK, вы не можете выгрузить загруженный файл.Вам нужно запустить отдельный процесс Ruby для каждого теста.(Или отдельный экземпляр Ruby, если вы работаете в реализации Ruby, которая поддерживает несколько экземпляров в одном процессе.)

0 голосов
/ 02 декабря 2011

Попробуйте использовать Kernel # load с wrap, установленным в true:

load (имя файла, wrap = false) → true

Загружает и выполняетпрограмма Ruby в файле с именем файла.Если имя файла не преобразуется в абсолютный путь, файл ищется в каталогах библиотеки, перечисленных в $ :.Если необязательный параметр wrap имеет значение true, загруженный сценарий будет выполняться в анонимном модуле, защищая глобальное пространство имен вызывающей программы.Ни при каких обстоятельствах любые локальные переменные в загруженном файле не будут передаваться в среду загрузки.

каждый раз, когда вы хотите выполнить тестирование компоновщика, load отправьте его в новый анонимный модуль.тестирует класс связки в этом модуле, а затем переходит к следующему тесту.

Если ваш код ссылается на константу Bundler, вам придется установить и сбросить эту константу.

Я сам не пробовал, но не понимаю, почему это не сработает.

0 голосов
/ 04 апреля 2011

Попробуйте отследить, какие константы были определены до начала ваших тестов и какие константы определены после его завершения, и удалите константы, которые были определены во время теста.

Полагаю, это не столько говорит о том, как вызывать magic_reset, сколько о том, как реализовать magic_reset.

...