web-dev-qa-db-fra.com

Comment organiser des tests minitest/unit?

Après avoir utilisé RSpec pour plusieurs projets, j'essaie minitest/unit. Jusqu'ici, j'aime bien, mais il me manque d'utiliser des blocs de description/contexte pour regrouper mes tests/spécifications de manière logique.

Je sais que minitest/spec fournit cette fonctionnalité, mais j'aime bien que minitest/unit se sente un peu plus près de barebones Ruby.

Existe-t-il des gemmes fournissant un support de description/contexte pour minitest/unit? Ou devrais-je simplement vivre avec mes longs fichiers de test non organisés en minitest/unit?

40
dojosto

Je connais plusieurs personnes venant de RSpec pour minitest aux prises avec la même question. Ils adorent la capacité à imbriquer à l'aide de blocs decrire/context et veulent continuer dans les moindres détails. Il y a plusieurs solutions:

  1. Utilisez la spécification DSL de minitest: Bien qu'il existe des différences mineures, la spécification DSL vous donne la plupart (toutes?) Des bonnes parties de la DSL rspec. La grande différence est le manque de blocs context. Mais vous pouvez tout aussi bien utiliser describe à sa place et tout fonctionne comme vous le souhaitiez.
  2. Utiliser des répertoires et des fichiers: je préfère cette option. Je n'aime pas parcourir un fichier de test de 300 lignes, que ce soit en utilisant le DSL ou le style classique xUnit. Je ne trouve pas les tests d'imbrication non liés utiles. Les mêmes règles de compréhension du code s'appliquent aux tests. Alors cassez-vous. Créez un répertoire et placez plusieurs fichiers dans celui-ci.

Voici un exemple de la façon dont mes fichiers de test sont organisés:

test/
     models/
            user/
                 authentication_test.rb
                 email_test.rb
                 reservation_test.rb
                 user_test.rb
                 username_test.rb

J'utilise cette structure, que j'utilise les styles DSL ou xUnit. Lorsque j'utilise la spécification DSL, je spécifie ce que je teste dans mon bloc de description de la manière suivante:

require "minitest_helper"

describe User, :authentications do

  before do
    # ...
42
blowmage

Vous pouvez également jeter plusieurs classes dans un fichier de test:

module PizzaTest
  class Isolation < ActiveSupport::TestCase
    test "is awesome by default" do
      assert Pizza.new.awesome?
    end
  end

  class Integration < ActiveSupport::TestCase
    fixtures :all

    test "is awesome too" do
      pizzas('one-with-everything').awesome?
    end
  end
end

et même des classes de test de nid:

class PizzaTest < ActiveSupport::TestCase
  test "is awesome by default" do
    assert Pizza.new.awesome?
  end

  class Integration < ActiveSupport::TestCase
    fixtures :all

    test "is awesome too" do
      assert pizzas('one-with-everything').awesome?
    end
  end
end
13
Wojtek Kruszewski

Je préfère cette façon (seulement un peu) mais je pense que c'est plus facile à suivre:

class ConventionalNameTest < ActiveSupport::TestCase
  class ContextTest < ConventionalNameTest
    # so much stuff...
  end
  class AnotherContextTest < ConventionalNameTest
    # and some more...
  end
10
kangkyu

Pour compléter la réponse précédente, je préfère cette option légèrement moins détaillée: 

class ConventionalNameTest < ActiveSupport::TestCase
  class ContextTest < self
    # so much stuff...
  end

  class AnotherContextTest < self
    # and some more...
  end
end
0
weilandia