Question

Existe-t-il une alternative aux RSPEC before(:suite) et after(:suite) Dans MinItest?

Je soupçonne qu'un coureur de test personnalisé est en ordre, mais je ne peux pas imaginer que ce n'est pas une exigence commune, donc quelqu'un a probablement mis en œuvre. :-)

Était-ce utile?

La solution

Il y a setup() et teardown() Méthodes disponibles. La documentation répertorie également before() et after() comme étant disponible.

Edit: cherchez-vous à exécuter quelque chose avant chaque test ou avant ou après la fin de toute la suite?

Autres conseils

Comme indiqué ci-dessus dans la réponse et les commentaires de Caley, MiniTest::Unit contient la fonction after_tests. Il n'y a pas before_tests ou équivalent, mais tout code dans votre minitest_helper.rb Le fichier doit être exécuté avant la suite de tests, ce qui fera le bureau d'une telle fonction.

Catche: encore relativement nouveau chez Ruby, et très nouveau chez Minitest, donc si je me trompe, s'il vous plaît corrigez-moi! :-)

Pour faire fonctionner cela avec la version actuelle de MinItest (5.0.6), vous devez require 'minitest' et utilise 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

Pour exécuter du code avant chaque tester, utiliser before. Vous opérez ici dans le contexte d'une instance, peut-être d'une classe générée implicitement par describe, donc les variables d'instance définissent before sont accessibles dans chaque test (par exemple à l'intérieur d'un it bloquer).

Pour exécuter du code avant tout tests, enroulez simplement les tests dans une classe, une sous-classe de MiniTest::Spec ou peu importe; Maintenant, avant les tests eux-mêmes, vous pouvez créer une classe ou un module, définir des variables de classe, appeler une méthode de classe, etc., et tout cela sera disponible dans tous les tests.

Exemple:

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

Voici la sortie, ainsi que mes commentaires en accolades expliquant ce que prouve chaque ligne de sortie:

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]

(Notez que je ne veux pas dire cette sortie pour impliquer une garantie sur l'ordre dans lequel les tests s'exécuteront.)

Une autre approche consiste à utiliser l'existant before Mais enveloppez le code pour fonctionner une seule fois dans un indicateur de variable de classe. Exemple:

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

Un moyen simple de le faire est d'écrire une méthode de classe gardée, puis d'appeler cela dans un begin.

Un minitest :: Spec Exemple:

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

...pour obtenir

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

La bonne chose à propos de MinItest est sa flexibilité. J'utilise un coureur de MinItest personnalisé avec un rappel ALLAVE_SUTE +. Quelque chose comme dans cet exemple - Ruby MinItest: configuration de la suite ou de la classe?

Puis dire à MinItest d'utiliser le coureur personnalisé

MiniTest::Unit.runner = MiniTestSuite::Unit.new

Vous pouvez également ajouter un rappel après le test en mettant à jour votre test_helper.rb (ou spec_helper.rb) comme celui-ci

# test_helper.rb

class MyTest < Minitest::Unit
  after_tests do
    # ... after test code
  end
end

Vous pouvez simplement placer le code en dehors de la classe.

C'est ce que je fais pour avoir une bannière.

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top