【发布时间】:2015-03-23 17:13:29
【问题描述】:
我正在使用 python 模拟库(python 2.7,mock==1.0.1),当我模拟我正在测试的某些代码部分时,mock 出于某种原因吞下了异常。
下面是一个例子:
#test.py
from django import test
from something import main_func
class TestCase(test.TestCase):
@mock.patch('something.somewhere')
def test_something(mock_somewhere):
main_func()
#something.py
def somewhere(param):
print param
def main_func():
somewhere(None.missing_something)
所以AttributeError 应该提高对吗?这个测试在我的机器上通过,实际上代码更复杂,一个 Django 模型应该被保存并存在。测试失败,因为模型不存在。
如果我在somewhere(None.missing_method) 之前插入一个import ipdb; ipdb.set_trace(),那么我可以看到AttributeException 被提出,但它没有出现在测试中。
有什么想法吗?
【问题讨论】:
-
出于好奇...您的单元测试文件末尾是否有
if __name__ == '__main__': unittest.main()行? -
请修复您无法运行的代码:错误太多,无法理解原因。我已经修复了测试类父
(unittest.TestCase)和self,mock_somewhere的测试参数,它按预期引发了异常。无论如何,如果您在调试器中看到异常但测试没有抓住它,我的猜测是您有更多线程并且异常不在您的测试线程中,而是在另一个线程中。 -
我添加了 1 行代码,现在可以运行此代码。我提到了 Django 模型,这是 Django 中的一个有效测试用例,由它的测试运行程序发现,我不需要
__name__。这没有使用任何线程,它只是一个普通的 django 应用程序,正在测试的方法只是在Model实例上操作的实用方法。 -
@DominicSantos AFAIK
test_something的签名是错误的:你忘了self -
我将您的代码剪切并粘贴到一个新的 django 项目中,通过添加
self作为第一个参数来修复test_something签名,我无法重现您的问题。在我这边somewhere(None.missing_something)按预期引发异常。
标签: python django unit-testing mocking