2017-08-11 2 views
0

Je suis nouveau sur les rails et j'ai fait un tri simple des dates dans l'ordre décroissant. et maintenant je dois écrire un test pour cela. mon contrôleur ressemble à cecitrier mini test dans les rails

def index 
    @article = Article.all.order('date DESC') 
end 

i essayé d'écrire un test, mais il ne fonctionne pas mon code

def setup 
    @article1 = articles(:one) 
end 

test "array should be sorted desc" do 
    sorted_array = article1.sort.reverse 
    assert_equal article1, sorted_array, "Array sorted" 
end 
+0

Pouvez-vous être plus précis s'il vous plaît. –

+0

Je veux écrire un test pour le tri des enregistrements –

Répondre

0

Vous devriez écrire une meilleure description, en disant ce que chaque partie du code fait référence à, comme:

# this is my controller_whatever.rb 
def index 
@article = Article.all.order('date DESC') 
end 

#this is my test/controllers/controller_whatever_test.rb 

def setup 
    @article1 = articles(:one) 
end 
... 

dans votre cas, vous n'avez pas créé un « tri », vous avez créé un controlleraction que les requêtes des enregistrements dans l'ordre décroissant, afin de le tester vous soit besoin d'un test de contrôleur ou d'un test d'intégration (je crois que les tests du contrôleur sont abandonnés au profit des tests d'intégration), qui sont plus complexes, car vous devez visiter le chemin du test, puis affirmer que vos résultats sont comme prévu .

Je pense que la meilleure façon de le faire est de créer réellement un scope pour votre modèle, utilisez cela lors de l'interrogation dans index et ensuite tester cette portée.

Ce serait quelque chose comme:

# app/models/article.rb 
scope :default -> { order(date: :desc) } 

Ce qui vous pouvez le tester avec:

#test/models/article_test.rb 

def setup 
    @articles = Article.all 
end 

test "should be most recently published first" do 
    assert_equal articles(:last), @articles.first 
    assert_equal articles(:first), @articles.last 
end 

Et vous auriez besoin de deux appareils avec des dates différentes au moins, mais je vous conseille de avoir 4 ou 5 avec des dates différentes et écrites dans un ordre différent dans le fichier articles.yml (pour vous assurer que le test passe parce qu'il est correct et pas simplement à cause de l'aléatoire), et changer votre action index simplement:

def index 
    @article = Article.all # since now you have a default_scope 
end 

(si vous avez d'autres endroits où vous interrogez les articles et vous avez besoin de les commander d'une autre manière, au lieu d'un default_scope, créez un particulier et l'utiliser, à la fois sur le contrôleur et le test du modèle)

+0

Hey! Micael merci beaucoup ça a marché pour moi: D –

0

I écrirait un test fonctionnel dans une classe de test en fonction du contrôleur de votre action d'index.

Je suppose que votre contrôleur est nommé ArticlesController puis le nom de la classe de test est ArticlesControllerTest placé dans test/controllers/articles_controller_test.rb.

Dans la méthode de test, vous appelez/demandez l'action d'index de votre contrôleur et vous vérifiez d'abord une réponse réussie. Ensuite, vous récupérez les articles que votre contrôleur renvoie dans la variable d'instance @article1, avec assigns(:article1).

Maintenant, vous pouvez vérifier vos articles sont définis et vous pouvez vérifier les dates. Ici, je parcourt tous les articles facilement et compare la date de l'article avant est supérieure ou égale à la date de l'article actuel, en raison de l'ordre décroissant. Pour un test simple, il devrait être acceptable, car vous ne devriez pas avoir une grande quantité d'enregistrements de test. Peut-être qu'il y a une meilleure façon de vérifier la commande.

class ArticlesControllerTest < ActionController::TestCase 
    test "index should provide sorted articles" do 
    get :index 
    assert_response :success 

    articles = assigns(:article1) 
    assert_not_nil articles 

    date = nil 
    articles.each do |article| 
     if date 
     assert date >= article.date 
     end 

     date = article.date 
    end 
    end 
end 

Lisez à propos de Functional Tests for Your Controllers dans les guides Rails 4.2 pour plus d'informations.