当前位置: 首页 > 面试题库 >

为什么python模拟补丁不起作用?

巫培
2023-03-14
问题内容

我有两个档案

秒杀

class T1(object):
    def foo(self, afd):
        return "foo"

    def get_foo(self):
        return self.foo(1)


def bar():
    return "bar"

test_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,第一个测试用例将通过,但是第二个将失败。而我切换到use nosetests test_spike.py,则两个都失败了。

我不明白这是怎么发生的?这些情况本应全部通过。


问题答案:

对于 test_foo, 您没有正确使用补丁。您应该像这样使用它:

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

现在,第二个示例不起作用,因为您导入了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()

这给了我:

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


 类似资料:
  • 问题内容: 我想嘲笑。但是,当我运行以下代码时,该模拟被完全忽略了,我不确定为什么 测试代码: 模块代码: 问题答案: 您没有在正确的位置打补丁。您在定义的地方打补丁: 您需要修补导入的位置,即在编写此行的“模块代码”中: 即,它应该看起来像: 要获得快速指南,请阅读文档中的部分:修补位置。

  • 问题内容: 使用模拟进行单元测试conn(): app.py test.py 错误:未调用 断言 。 我认为这是因为’Database_url’不在我打补丁的os.environ中,并且因为没有对mysql_mock.connect进行该测试调用。 问题: 1为了使此测试代码有效,我需要进行哪些更改? 2.我还必须修补’urlparse’吗? 问题答案: 您可以尝试此解决方案。只需调用一个参数即可

  • 问题内容: 我正在尝试使用富有想象力的Mock测试库测试Django应用程序时模拟某些东西。我似乎无法完全正常工作,我正在尝试这样做: 我究竟做错了什么? 问题答案: 啊,我对在哪里应用该补丁装饰感到困惑。固定:

  • 在规范中,我想模拟类: b)我可以在文档中找到关于为什么要为存根或模拟调用原始类方法的信息?

  • 当我用这样的sql查询执行请求时(在cosmos db模拟器中) 我有这个错误“语法错误,'GROUP'附近的语法不正确。”如果删除group by(和count(1))请求正在工作。 我的代码与 MSDN 中的第一个示例完全相同,https://docs.microsoft.com/en-us/azure/cosmos-db/sql-query-group-by 我的查询有什么问题?

  • 问题内容: 我的问题就像标题说的那样:为什么我们需要9个补丁的图像?他们真的那么重要吗?其实,他们真正在做什么?我没有清楚地了解9色块图像的概念。 我知道9补丁图像是可伸缩的。因此,假设我有一些完全适合我的ldpi设备的图像按钮。使用Draw 9-patch工具(android SDK的一部分),我可以标记可缩放区域,并且该图像非常适合hdpi甚至xhdpi设备。边缘会很光滑。 但这真的是很好的实