使用nosetests时出现断言错误

3

在学习Python的艰难之路中的第48个练习中,我被要求创建一个模块,供lexicon_tests.py测试:

from nose.tools import *
from ex48 import lexicon


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

def test_verbs():
    assert_equal(lexicon.scan("go"), [('verb', 'go')])
    result = lexicon.scan("go kill eat")
    assert_equal(result, [('verb', 'go'),
                          ('verb', 'kill'),
                          ('verb', 'eat')])


def test_stops():
    assert_equal(lexicon.scan("the"), [('stop', 'the')])
    result = lexicon.scan("the in of")
    assert_equal(result, [('stop', 'the'),
                          ('stop', 'in'),
                          ('stop', 'of')])


def test_nouns():
    assert_equal(lexicon.scan("bear"), [('noun', 'bear')])
    result = lexicon.scan("bear princess")
    assert_equal(result, [('noun', 'bear'),
                          ('noun', 'princess')])

def test_numbers():
    assert_equal(lexicon.scan("1234"), [('number', 1234)])
    result = lexicon.scan("3 91234")
    assert_equal(result, [('number', 3),
                          ('number', 91234)])


def test_errors():
    assert_equal(lexicon.scan("ASDFADFASDF"), [('error', 'ASDFADFASDF')])
    result = lexicon.scan("bear IAS princess")
    assert_equal(result, [('noun', 'bear'),
                          ('error', 'IAS'),
                          ('noun', 'princess')])

因此,我创建了模块lexicon.py,用于在此处进行测试:

def scan(words):
    directions = ['north', 'south', 'east', 'west', 'down', 'up', 'left', 'right', 'back']
    verbs = ['go', 'stop', 'kill', 'eat']
    stop_words = ['the', 'in', 'of', 'from', 'at', 'it']
    nouns = ['door', 'bear', 'princess', 'cabinet']


    lex = words.split()
    list1 = []

    for i in lex:
        if i in directions:
            list1.append(('direction', i))
        elif i in verbs:
            list1.append(('verb', i))
        elif i in stop_words:
             list1.append(('stop-word', i))
        elif i in nouns:
            list1.append(('noun', i))
        elif i.isdigit():
            list1.append(('number', convert_number(i)))
        else:
            list1.append(('error', i))
    print list1 

def convert_number(s):
    try:
        return int(s)

    except ValueError:
        return None

然而,当我在PowerShell中运行nosetests时,我会得到以下断言错误:
Traceback (most recent call last):
  File "G:\Python27\lib\site-packages\nose\case.py", line 197, in runTest
    self.test(*self.arg)
  File        "G:\Users\Charles\dropbox\programming\lexicon_test\skeleton\tests\lexicon_tests.py", line   6, in test_directions
    assert_equal(lexicon.scan("north"), [('direction', 'north')])
AssertionError: None != [('direction', 'north')]
-------------------- >> begin captured stdout << ---------------------
[('direction', 'north')]

这是我每次测试运行时收到的相同错误消息,对于lexicon_tests.py中的六个函数,每个函数都有一个错误消息。这个错误是什么意思? 这已经让我感到很烦了一段时间了。提前谢谢。


1
为什么你要把 scan 的输出用 print 来打印,而不是用 return 来返回它呢? - user2357112
我真的甚至没有停下来想过那会如何影响assert函数。一开始我放了print,因为我独立使用那个模块只是为了看看它是否有效。我想我只是没有删除它,因为我错误地认为它是不必要的。 - Amon
1个回答

4
assert_equal函数接受两个参数,如果这两个参数不相等,则会抛出一个错误。在这种情况下,lexicon.scan("north")的结果是None,因为它与[('direction', 'north')]不相等,所以它抛出了一个错误。
换句话说,你的lexicon.scan函数没有正常工作。这可能与缺少一个return语句有关。

1
太棒了,这真的很容易,谢谢。问题基本上是assert函数没有正确地返回信息给它们?再次感谢。 - Amon
1
@Amon 是的,就是这样。 - Xymostech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接