Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

Unittests in rails: waarom verschil met test in console?

Pagina: 1
Acties:
  • 108 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
IIk heb een probleempje met unittests in ruby on rails (v1.2.3), waar ik niet uitkom. Ik hoop dat iemand hier me daarmee kan helpen.

Ik heb een unittest gemaakt om de klasse 'order' uit mijn model te testen. Deze klasse heeft, naast enkele validaties, ook een aantal velden die worden geupdate na iedere save(). Zo heeft iedere order een of meerdere order_items, en wordt na een save altijd de totale prijs van de order opnieuw uitgerekend.
Nu wil ik ook testen of dat uitrekenen van de totale kosten in enkele situaties goed gaat. Ik heb dus fixtures aangemaakt, die geladen worden in de unittest, en een test geschreven:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
require File.dirname(__FILE__) + '/../test_helper'

class OrderTest < Test::Unit::TestCase
  fixtures :clients, :countries, :delivery_addresses, :books, :order_items, :orders

  # Sla order 1 op, en kijk of de prijzen correct zijn uitgerekend.
  def test_nl_standaard
    o = orders(:nl_standaard)
    
    # sla order op, om te verifieren dat save correct werkt en de prijzen opnieuw te laten berekenen.
    assert o.save, "failed saving order"
    
    # verifieer de correctheid van de prijs velden.
    assert_equal o.price, 637.43, "incorrect order.price"
    assert_equal o.subtotal_price, 609.68, "incorrect order.subtotal_price"
    assert_equal o.subtotal_shippingcosts, 27.75, "incorrect order.subtotal_shippingcosts"

    # verifieer dat destroy() werkt.
    assert o.destroy, "failed destroying order"
  end
end


Deze test faalt op o.save. Als ik echter vervolgens een console in test mode open (de fixtures staan dan nog in de database), de betreffende order 'find', en save aanroep, werkt het opslaan wel. Van het aanroepen van 'rake test:units --trace' wordt ik ook niets wijzer: in de trace valt namelijk slechts het volgende te zien:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
1) Failure:
test_nl_standaard_prices(OrderTest) [./test/unit/order_test.rb:11]:
failed saving order.
<false> is not true.

11 tests, 11 assertions, 1 failures, 0 errors
rake aborted!
Command failed with status (1): [/usr/bin/ruby1.8 -Ilib:test "/usr/lib/ruby...]
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:719:in `sh'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:726:in `call'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:726:in `sh'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:805:in `sh'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:740:in `ruby'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:805:in `ruby'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake/testtask.rb:117:in `define'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:823:in `verbose'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake/testtask.rb:102:in `define'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:392:in `call'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:392:in `execute'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:392:in `each'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:392:in `execute'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:362:in `invoke'
/usr/lib/ruby/1.8/thread.rb:135:in `synchronize'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:355:in `invoke'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1739:in `top_level'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1739:in `each'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1739:in `top_level'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1761:in `standard_exception_handling'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1733:in `top_level'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1711:in `run'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1761:in `standard_exception_handling'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake.rb:1708:in `run'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/bin/rake:7
/usr/bin/rake:18:in `load'
/usr/bin/rake:18


Ik heb geen idee waar ik dit probleem in moet zoeken. Aangezien, met dezelfde fixtures vanuit de console de save wel werkt, en in de trace ook het model niet terug te vinden is. Ergens is er dus iets anders wanneer een unittest wordt gedraaid. Zou iemand mij een duwtje in de juiste richting kunnen geven? Bij voorbaat dank!

  • FooBarWidget
  • Registratie: September 2004
  • Laatst online: 12-09-2024
Als je eerst o.valid? aanroept en vervolgens in o.errors kijkt, zie je wat de preciese validatie-fouten zijn.

Trouwens, waarom gebruik je 1.2.3? Die is oud en bevat mogelijk beveiligingsgaten. Je kan beter upgraden naar 1.2.6.

[ Voor 12% gewijzigd door FooBarWidget op 12-01-2008 20:58 ]


Verwijderd

Topicstarter
Bedankt voor deze tip! Zo ben ik er achter gekomen, dat ik blijkbaar 1 fixture vergeten was te laden in deze test. Toch typisch: ik had verwacht dat de rails tests dit soort info wel zou weergeven, aangezien unittests toch bedoeld zijn om fouten te vinden. Iig werkt de test nu!

Oh, en je hebt gelijk... ik moet mijn rails installatie maar eens upgraden.

  • Ruphin
  • Registratie: September 2006
  • Laatst online: 21-10 03:06
Rails v2.0 is alweer een maandje geleden gereleased. Hoewel het nog niet helemaal stabiel draait op alle platformen, zitten er wel een aantal veranderingen in die het best waard zijn om over te stappen. Er zijn ook een aantal conventies veranderd, dus ik zou daar ook even naar kijken. Je vindt alles terug op weblog.rubyonrails.org

  • FooBarWidget
  • Registratie: September 2004
  • Laatst online: 12-09-2024
Toch typisch: ik had verwacht dat de rails tests dit soort info wel zou weergeven, aangezien unittests toch bedoeld zijn om fouten te vinden.
En dat doet hij ook. Je assert of die save gelukt was (dus of die true retourneert). Dit is niet het geval, dus zegt hij dat ook. De unit test doet exact wat het hoort te doen.
Je bent in dit geval juist geïnteresseerd in *waarom* hij faalt, en niet *dat* hij faalt. Dat is debuggen en dat zal je toch zelf moeten doen.

Verwijderd

Topicstarter
FooBarWidget schreef op maandag 14 januari 2008 @ 09:46:
[...]


En dat doet hij ook. Je assert of die save gelukt was (dus of die true retourneert). Dit is niet het geval, dus zegt hij dat ook. De unit test doet exact wat het hoort te doen.
Je bent in dit geval juist geïnteresseerd in *waarom* hij faalt, en niet *dat* hij faalt. Dat is debuggen en dat zal je toch zelf moeten doen.
Tja, ik had eigelijk toch verwacht dat rails je hierbij, zoals bij wel meer dingen, een handje helpt. Aangezien tests dienen om debuggen makkelijker te maken, had ik verwacht dat ze errors e.d. wel zouden weergeven bij een gefaalde test. Maar zo ben ik er gelukkig ook uit gekomen.
Pagina: 1