2011-08-01 3 views
0

Voici une partie du test unitaire:Je ne comprends pas comment ce test unitaire échoue

from nose.tools import * 
from testing import * 


def test_directions(): 
     assert_equal(scan("north"), [('direction', 'north')]) 
     result = scan("north south east") 
     assert_equal(result, [('direction', 'north'), ('direction', 'south'), ('direction', 'east')]) 

Et voici mon code:

import string 

def convert_number(s): 
    try: 
     return int(s) 
    except ValueError: 
     return None 

def scan(s): 

    direction_words= ("north", "south", "east", "west", "down", "up", "left", "right", "back", "forwards", "backwards") 
    verbs= ("go", "stop", "kill", "eat", "shoot", "run", "hide", "dodge") 
    stop_words= ("the", "in", "of", "from", "at", "it") 
    nouns= ("door", "bear", "princess", "cabinet", "gold", "money", "chest", "gun", "sword")   
    numbers= s.split() 
    i=0 
    j=0 
    g=0 
    m=0 
    a=0 
    b=0 

    while a < len(numbers): 
     if type(convert_number(numbers[a])) == int: 
      print [('number', int(numbers[a]))] 
      a += 1 
     else: 
      a += 1 


    while i < len(direction_words): 
     if direction_words[i] in s.split(): 
      s= string.lower(s) 
      print [('direction', direction_words[i]) ] 
      i+=1 
     else: 
      i+=1     

    while j < len(verbs): 
     if verbs[j] in s.split(): 
      s= string.lower(s) 
      print [('verb', verbs[j])] 
      j+=1 
     else: 
      j+=1  

    while g < len(stop_words): 
     if stop_words[g] in s.split(): 
      s= string.lower(s) 
      print [('stop', stop_words[g])] 
      g+=1 
     else: 
      g+=1 

    while m < len(nouns): 
     if nouns[m] in s.split(): 
      s= string.lower(s) 
      print [('noun', nouns[m])] 
      m+=1 

     else: 
      m+=1    

    while b< len(s.split()):  
     if numbers[b] not in nouns: 
      if numbers[b] not in stop_words: 
       if numbers[b] not in verbs: 
        if numbers[b] not in direction_words: 
         if type(convert_number(numbers[b])) != int: 
          print [('error', numbers[b])] 
          b += 1 

         else: 
          b+=1  
        else: b+=1 
       else: b+=1 
      else: b+=1 
     else: b+=1 


    else: 
     return 

Quand je lance les tests unitaires ici est ce que je reçois:

F 
====================================================================== 
FAIL: tests.ex48_tests.test_directions 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/nose/case.py", line 197, in runTest 
    self.test(*self.arg) 
    File "/Users/Adam/Desktop/projects/ex48/tests/ex48_tests.py", line 6, in test_directions 
    assert_equal(scan("north"), [('direction', 'north')]) 
AssertionError: None != [('direction', 'north')] 
-------------------- >> begin captured stdout << --------------------- 
[('direction', 'north')] 

--------------------- >> end captured stdout << ---------------------- 

---------------------------------------------------------------------- 
Ran 1 test in 0.015s 

FAILED (failures=1) 

Je ne comprends pas comment le test échoue. Quand je lance le programme dans le terminal, il produit exactement le même résultat que dans les tests unitaires. Je ne comprends pas pourquoi ça ne passe pas.

Répondre

4

Parce que votre fonction est l'impression le résultat au lieu de retournaient il:

while i < len(direction_words): 
    if direction_words[i] in s.split(): 
     s= string.lower(s) 
     print [('direction', direction_words[i]) ] # <--- HERE 
     i+=1 

J'ai pas lu tous LPTHW, donc je ne peux pas vous dire exactement ce que la meilleure façon de fixer ce code dans le contexte du livre est ... Mais si je l'écris, je renvoie une liste, comme ceci:

def scan(s): 
    result = [] 
    ... 

    while i < len(direction_words): 
     if direction_words[i] in s.split(): 
      s= string.lower(s) 
      # change the `print` statements to `result += …` 
      result += [('direction', direction_words[i]) ] 
      i+=1 

    ... 
    return result 
+0

Awesome prend tout son sens. J'ai dû changer les tests parce que maintenant le résultat de la fonction scan est dans l'ordre des tuples que j'ai créés au lieu de l'ordre de la phrase. Ne pensez pas que cela fera une différence. – Adam

+0

Cool. Si l'ordre des valeurs de retour n'est pas important (ex, si '('direction', 'north'), ('direction', 'south')]' est aussi valide que '['' direction ', 'sud'), ('direction', 'nord')] '), alors vous pouvez utiliser [' set' intégré] (http://docs.python.org/library/sets.html) ([Wikipedia] ] (http://en.wikipedia.org/wiki/Set_ (computer_science))) lorsque vous comparez les listes. Ex: 'assert_equal (set (résultat), set ([('direction', 'north'), ...])'. Cela fonctionnera car les ensembles sont non ordonnés, donc 'set ([1,2,3]) == set ([3,2,1]) '. –

0

Votre fonction scan() imprime le texte à l'écran et ne renvoie rien, mais votre test unitaire vérifie la valeur de retour de la fonction.

Vous devez modifier la fonction scan() afin qu'elle renvoie la sortie qui vous intéresse plutôt que de simplement l'imprimer.

0

Il y a beaucoup de choses qui ne vont pas avec votre code, mais la plus évidente est que scan ne retourne jamais rien, donc result est toujours None.

+0

Je sais que c'est très très mauvais code. Je suis vraiment nouveau à la programmation et travaille sur ce problème depuis environ 3 jours maintenant. Il a subi de nombreux changements et modifications et je suis sûr que cela pourrait être fait de façon beaucoup plus élégante. Merci pour l'aide en tout cas. – Adam

1

la fonction scan() retourne Aucun. Donc l'assertion:

assert_equal(scan("north"), [('direction', 'north')]) 

échoue correctement.

+0

Ahhh je vois, merci beaucoup. – Adam

Questions connexes