python nosetests AssertionError: None != 'hmmm...'

python nosetests AssertionError: None != 'hmmm...'

下面是我正在尝试的测试 运行:

    def test_hmm_method_returns_hmm(self):
    #set_trace()
    assert_equals( orphan_elb_finder.hmm(), 'hmmm...')

当我 运行 代码时,我得到以下输出:

D:\dev\git_repos\platform-health\tests\unit\test_orphan_elb_finder>nosetests
.F
======================================================================
FAIL: test_hmm_method_returns_hmm (test_orphan_elb_finder.test_basic.BasicTestSuite)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "D:\dev\git_repos\platform-health\tests\unit\test_orphan_elb_finder\test_basic.py", line 18, in test_hmm_method_returns_hmm
    self.assertEqual(orphan_elb_finder.hmm(), 'hmmm...')
AssertionError: None != 'hmmm...'
-------------------- >> begin captured stdout << ---------------------
hmmm...

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

----------------------------------------------------------------------
Ran 2 tests in 0.002s

FAILED (failures=1)

似乎是 orphan_elb_finder.hmm 结果为 None。这很奇怪,因为当我手动取消注释 set_trace 和 运行 命令时,它会给我正确的输出:

-> assert_equals( orphan_elb_finder.hmm(), 'hmmm...')
(Pdb) orphan_elb_finder.hmm()
hmmm...

但是当我在调试器中尝试 运行 相同的断言时:

(Pdb) assert_equals(orphan_elb_finder.hmm(), 'hmmm...')
hmmm...
*** AssertionError: None != 'hmmm...'

我感觉这与 stdout 的使用方式有关,但我对如何查找更多信息/解决此问题有点迷茫。

下面是 orphan_elb_finder 方法:

# -*- coding: utf-8 -*-

def get_hmm():
    """Get a thought."""
    return 'hmmm...'

def hmm():
    """Contemplation..."""
    print get_hmm()

如有任何帮助,我们将不胜感激

更新:

所以在 Blckknght 响应之后,我尝试调用 get_hmm 而不是 hmm()。但是当我尝试调用该方法时,出现以下错误

    assert_equals(orphan_elb_finder.get_hmm(), 'hmmm...')
AttributeError: 'module' object has no attribute 'get_hmm'

然后我尝试检查可用的方法

(Pdb) dir(orphan_elb_finder)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'core', 'hmm']

似乎出于某种原因,下面的模块没有显示 get_hmm() 方法?

更新 2:

知道是怎么回事了。在我的 orphan_elb_finder 包里面 init.py 我有

from .core import hmm

改为

from .core import get_hmm

它似乎奏效了。不知何故,我认为包构造的作者将 get_hmm 缩进为私有方法。不确定如果是这种情况,我将如何测试它 get_hmm returns None?

get_hmm方法不同,hmm方法没有return语句。它 print 是字符串 "hmmm...",但 return 是 None.

比较调用 get_hmm() 和调用 hmm()。前者将打印带有引号的 'hmmm...'。那是因为它正在 returning 字符串,并且交互式控制台正在打印 return 值的 repr。相反,当您调用 hmm() 时,它会自己打印(不带引号),然后 returns None(未指定其他内容时的默认 return 值).当 return 值为 None 时,交互式控制台会跳过打印出 repr 的值,因此没有额外打印任何内容。

>>> get_hmm()
'hmmm...'
>>> hmm()
hmmm...