2009-09-26 18 views
1

Mon contrôleur est capable de créer un enfant book_loan. J'essaie de tester ce comportement dans un test fonctionnel mais j'ai du mal à utiliser la méthode assert_difference. J'ai essayé un certain nombre de façons de passer le nombre de book_loans à assert_difference sans aucune chance.Affirmer la différence de nombre d'enfants en relation dans Ruby on Rails

test "should create loan" do 
    @request.env['HTTP_REFERER'] = 'http://test.com/sessions/new' 
    assert_difference(books(:ruby_book).book_loans.count, 1) do 
     post :loan, {:id => books(:ruby_book).to_param, 
           :book_loan => {:person_id => 1, 
               :book_id => 
               books(:dreaming_book).id}} 

    end 
    end 

ne peut pas convertir BookLoan en chaîne

assert_difference(books(:ruby_book).book_loans,:count, 1) 

NoMethodError: méthode non définie '' pour book_loans #

assert_difference('Book.book_loans.count', +1) 

ne peut pas convertir Proc en chaîne

assert_difference(lambda{books(:ruby_book).book_loans.count}, :call, 1) 

Répondre

3

Il semble que assert_difference attend une chaîne, qu'elle va évaluer avant et après le bloc. Donc, ce qui suit peut fonctionner pour vous:

assert_difference('books(:ruby_book).book_loans.count', 1) do 
    ... 
end 
2

J'ai eu des problèmes avec cela aussi et juste compris comment cela fonctionne. Comme le message original, moi aussi je cherchais quelque chose comme ceci:

# NOTE: this is WRONG, see below for the right way. 
assert_difference(account.users.count, +1) do                          
    invite.accept(another_user) 
end 

Cela ne fonctionne pas parce qu'il n'y a aucun moyen pour assert_difference-effectuer une action avant d'exécuter le bloc et après l'exécution du bloc.

La raison pour laquelle la chaîne fonctionne est que la chaîne peut être évaluée pour déterminer si la différence attendue a été générée.

Mais une chaîne est une chaîne, pas le code. Je crois qu'une meilleure approche est de passer quelque chose qui peut être appelé. Envelopper l'expression dans un lambda fait exactement cela; il permet assert_difference d'appeler le lambda pour vérifier la différence:

assert_difference(lambda { account.users.count }, +1) do                          
    invite.accept(another_user) 
end