Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么python模拟补丁不';不行?_Python_Unit Testing_Mocking_Nose - Fatal编程技术网

为什么python模拟补丁不';不行?

为什么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

我有两个文件

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, 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影响”->,这救了我的命!可能重复的