为什么python模拟补丁不';不行?
我有两个文件 spike.py为什么python模拟补丁不';不行?,python,unit-testing,mocking,nose,Python,Unit Testing,Mocking,Nose,我有两个文件 spike.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, MagicM
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\u spike.py
时,第一个测试用例将通过,但第二个测试用例将失败。
然后我切换到使用nosetests test\u spike.py
,然后两个都失败了
我不明白这是怎么发生的?这些案例应该全部通过。使用
spike.bar
访问bar
。导入的bar
不受mock.patch
的影响
from unittest import TestCase
import unittest
from mock import patch, MagicMock
from spike import T1
import spike # <----
class TestShit(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 = spike.bar() # <-----
self.assertEqual('patched', bar)
if __name__ == "__main__":
unittest.main()
从unittest导入TestCase
导入单元测试
来自模拟导入补丁,MagicMock
从spike导入T1
为测试导入spike#,因为您没有正确使用修补程序。您应该这样使用它:
class TestFoo(TestCase):
@patch.object(T1, 'foo', MagicMock(return_value='patched'))
def test_foo(self):
foo = T1().get_foo()
self.assertEqual('patched', foo)
这给了我:
nosetests test_spike.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
python test_spike.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
现在,第二个示例不起作用,因为您导入了bar函数(获取对它的引用),然后尝试模拟它。当您模拟某些东西时,您无法更改变量所包含的内容(对原始函数的引用)。要解决此问题,应使用@falsetru建议的方法,如:
from unittest import TestCase
import unittest
from mock import patch
import spike
class TestFoo(TestCase):
@patch('spike.bar')
def test_bar(self, mock_obj):
mock_obj.return_value = 'patched'
value = spike.bar()
self.assertEqual('patched', value)
if __name__ == "__main__":
unittest.main()
这给了我:
nosetests test_spike.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
python test_spike.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
但当我试着用鼻子跑步时,我得到:
nosetests test_spike.py
F
======================================================================
FAIL: test_bar (src.test_spike.TestFoo)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/zilva/envs/test/local/lib/python2.7/site-packages/mock/mock.py", line 1305, in patched
return func(*args, **keywargs)
File "/home/zilva/git/test/src/test_spike.py", line 11, in test_bar
self.assertEqual('patched', value)
AssertionError: 'patched' != 'bar'
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (failures=1)
发生这种情况是因为我没有在正确的位置进行修补。我的目录结构是:
test/
└── src/
├── spike.py
├── test_spike.py
└── __init__.py
我从src目录运行测试,所以我应该使用项目根目录的路径进行修补,如:
@patch('src.spike.bar')
这将给我:
nosetests test_spike.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
或者如果我在测试目录:
nosetests src/test_spike.py
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
谢谢,它适用于python test\u spike.py
,但为什么它仍然不适用于nosetests test\u spike.py
?@LeoShi,对不起,我不知道。“导入的条不受mock.patch影响”->,这救了我的命!可能重复的