До / После Suite при использовании Ruby MiniTest - PullRequest
37 голосов
/ 04 мая 2011

Есть ли альтернатива RSpec before(:suite) и after(:suite) в MiniTest?

Я подозреваю, что пользовательский тестовый прогон в порядке, однако я не могу себе представить, что это не распространенное требование, поэтому кто-то, вероятно, реализовал в.: -)

Ответы [ 8 ]

25 голосов
/ 04 мая 2011

Доступны методы setup() и teardown().В документации также перечислены before() и after() как доступные.

Редактировать: Вы хотите запустить что-то перед каждым тестом, или до, или после того, как весь комплект закончен?

21 голосов
/ 19 января 2012

Как отмечено выше в ответе и комментариях Кейли, MiniTest::Unit содержит функцию after_tests. before_tests или его эквивалент не существует, но любой код в вашем файле minitest_helper.rb должен быть запущен до набора тестов, чтобы эта функция выполнялась.

Предостережение: все еще относительно нов в Ruby и очень нов в Minitest, поэтому, если я ошибаюсь, пожалуйста поправьте меня! : -)

19 голосов
/ 24 августа 2013

Чтобы это работало с текущей версией Minitest (5.0.6), вам нужно require 'minitest' и использовать Minitest.after_run { ... }.

warn "MiniTest::Unit.after_tests is now Minitest.after_run. ..."

https://github.com/seattlerb/minitest/blob/master/lib/minitest.rb https://github.com/seattlerb/minitest/blob/master/lib/minitest/unit.rb

5 голосов
/ 19 сентября 2012

Чтобы запустить код перед каждым тестом, используйте before.Вы работаете здесь в контексте экземпляра, возможно, класса, неявно сгенерированного describe, поэтому переменные экземпляра, заданные в before, доступны в каждом тесте (например, внутри блока it).

Чтобы запустить код перед всеми тестами, просто оберните тесты в классе, подклассе MiniTest::Spec или любом другом;теперь перед самими тестами вы можете создать класс или модуль, установить переменные класса, вызвать метод класса и т. д., и все это будет доступно во всех тестах.

Пример:

require "minitest/autorun"

class MySpec < MiniTest::Spec
  class MyClass
  end
  def self.prepare
    puts "once"
    @@prepared = "prepared"
    @@count = 0
  end
  prepare
  before do
    puts "before each test"
    @local_count = (@@count += 1)
  end
  describe "whatever" do
    it "first" do
      p MyClass
      p @@prepared
      p @local_count
    end
    it "second" do
      p MyClass
      p @@prepared
      p @local_count
    end
  end
end

Вот вывод вместе с моими комментариями в фигурных скобках, объясняющими, что доказывает каждая строка вывода:

once [this code, a class method, runs once before all tests]

Run options: --seed 29618 [now the tests are about to run]
# Running tests:

before each test [the before block runs before each test]
MySpec::MyClass [the class we created earlier is visible in each test]
"prepared" [the class variable we set earlier is visible in each test]
1 [the instance variable from the before block is visible in each test]

before each test [the before block runs before each test]
MySpec::MyClass [the class we created earlier is visible in each test]
"prepared" [the class variable we set earlier is visible in each test]
2 [the instance variable from the before block is visible each test]

(Обратите внимание, что я не имею в виду, что этот вывод подразумевает какую-либо гарантию порядка вкакие тесты будут выполняться.)

Другой подход заключается в использовании существующего before, но перенос кода выполняется только один раз в флаге переменной класса.Пример:

class MySpec < MiniTest::Spec
  @@flag = nil
  before do
    unless @@flag
      # do stuff here that is to be done only once
      @@flag = true
    end
    # do stuff here that is to be done every time
  end
  # ... tests go here
end
3 голосов
/ 24 сентября 2014

Один простой способ сделать это - написать метод защищенного класса, а затем вызвать его в begin.

Пример Minitest :: Spec:

describe "my stuff" do
  def self.run_setup_code
    if @before_flag.nil?
      puts "Running the setup code"
      @before_flag = true
    end
  end

  before do
    self.class.run_setup_code
  end

  it "will only run the setup code once" do
    assert_equal 1, 1
  end

  it "really only ran it once" do
    assert_equal 1,1
  end
end

...получить

Run options: --seed 11380

# Running:

Running the setup code
..

Finished in 0.001334s, 1499.2504 runs/s, 1499.2504 assertions/s.

2 runs, 2 assertions, 0 failures, 0 errors, 0 skips
0 голосов
/ 03 июня 2015

Вы можете просто разместить код вне класса.

Это то, что я делаю, чтобы иметь баннер.

require 'selenium-webdriver'
require 'minitest/test'
require 'minitest/autorun'

class InstanceTest < Minitest::Test

    def setup
    url     = ARGV.first
    @url    = self.validate_instance(url)
        @driver = Selenium::WebDriver.for :firefox
    end
0 голосов
/ 16 июля 2014

Вы также можете добавить обратный вызов после тестирования, обновив свой test_helper.rb (или spec_helper.rb) следующим образом:

# test_helper.rb

class MyTest < Minitest::Unit
  after_tests do
    # ... after test code
  end
end
0 голосов
/ 24 июля 2012

Приятной особенностью minitest является его гибкость. Я использовал собственный MiniTest Runner с обратным вызовом + before_suite +. Нечто подобное в этом примере - Ruby Minitest: настройка уровня люкс или класса?

А затем скажите Минитесту использовать пользовательский бегун

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