Я не понимаю, как этот модульный тест терпит неудачу - PullRequest
0 голосов
/ 02 августа 2011

Вот часть модульного теста:

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')])

А вот мой код:

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

Когда я запускаю модульные тесты, вот что я получаю:

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)

Я не понимаю, как тест не проходит.Когда я запускаю программу в терминале, она дает тот же результат, что и в модульных тестах.Я не понимаю, почему это не проходит.

Ответы [ 4 ]

4 голосов
/ 02 августа 2011

Поскольку ваша функция печатает результат вместо возвращает it:

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

Я еще не прочитал весь LPTHW, поэтому я не могу точно сказать вам, как лучше всего исправить этот код в контексте книги ... Но если бы я писал его, я бы возвратил список , вот так:

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
1 голос
/ 02 августа 2011

Функция scan () возвращает None. Итак, диссертация:

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

правильно не работает.

0 голосов
/ 02 августа 2011

В вашем коде много неправильного, но наиболее очевидным является то, что scan никогда ничего не возвращает, поэтому result всегда None.

0 голосов
/ 02 августа 2011

Ваша scan() функция выводит текст на экран и ничего не возвращает, но ваш тестовый модуль проверяет возвращаемое значение функции.

Вам следует изменить функцию scan(), чтобы она возвращала интересующий вас вывод, а не просто печатать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...