我有两个文件
尖峰.py
class T1(object):
def foo(self, afd):
return "foo"
def get_foo(self):
return self.foo(1)
def bar():
return "bar"
测试_spike.py:
from unittest import TestCase
import unittest
from mock import patch, MagicMock
from spike import T1, bar
class TestStuff(TestCase):
@patch('spike.T1.foo', MagicMock(return_value='patched'))
def test_foo(self):
foo = T1().get_foo()
self.assertEqual('patched', foo)
@patch('spike.bar')
def test_bar(self, mock_obj):
mock_obj.return_value = 'patched'
bar = bar()
self.assertEqual('patched', bar)
if __name__ == "__main__":
unittest.main()
当我运行python test_spike.py
时,第一个测试用例将通过,但第二个将失败。
我切换到使用nosetests test_spike.py
,那么这两个都失败了。
我不明白这是怎么回事?这些案子应该都通过了。
对于test_foo您没有正确使用修补程序。你应该这样使用它:
这给了我:
现在,第二个示例不起作用,因为您导入bar函数(获取对它的引用),然后尝试模拟它。当你模仿某个东西时,你不能改变你的变量所包含的内容(对原始函数的引用)。要解决此问题,应使用@false tru建议的方法,如:
这给了我:
但是当我试着用鼻子来检查的时候我会得到:
这件事之所以发生,是因为我修补的地方不对。我的目录结构是:
我从src目录运行测试,因此应该使用项目根目录中的路径进行修补,如:
这会给我:
或者如果我在测试目录:
使用
spike.bar
访问bar
。导入的bar
不受mock.patch
的影响。相关问题 更多 >
编程相关推荐