2017-08-31 2 views
1

J'ai plusieurs tests d'intégration où certaines des affirmations sont les mêmes. Pour des raisons de maintenabilité, j'aimerais regrouper les assertions communes de chaque test sous une fonction unique.Encapsuler des assertions répétées dans une fonction

test "login with invalid information" do 
    get login_path 
    assert_template 'sessions/new' 
    post login_path, params: { session: { email: "", password: "" } } 
    assert_template 'sessions/new' 
    assert_not flash.empty? 
    get root_path 
    assert flash.empty? 
    end 

    test "login with valid information followed by logout" do 
    get login_path 
    assert_template 'sessions/new' 
    post login_path, params: { session: { email: @user.email, password: "password" } } 
    . 

    end 

Par exemple, le

get login_path 
assert_template 'sessions/new' 

bits sont répétées dans les deux tests. Comment puis-je rendre cela plus facile à maintenir?

Répondre

0

La partie que vous décrivez comme "répétée" ne doit pas être confirmée pour chaque test. Si le premier test échoue lors de l'affirmation du modèle, les autres tests utilisant la même assertion échoueront également. Cela signifie que vous devez extraire cette logique de test dans un seul test, quelque chose comme test 'login rendered template' et enlever les get & assert_template des autres tests:

test "login rendered template" do 
    get login_path 
    assert_template 'sessions/new' 
end 

test "login with invalid information" do 
    # template assertion already done in previous test 
    post login_path, params: { session: { email: "", password: "" } } 
    # [...] 
end 

Voici un exemple d'une mauvaise pratique pour tester votre application. Un seul test devrait faire des assertions sur une logique/caractéristique spécifique et ne pas être répété. Si vous voyez des morceaux de code/assertions répétés dans votre suite de tests, il devrait probablement être extrait dans un seul test.