标签: magicmock

Python返回MagicMock对象而不是return_value

我有一个python文件a.py,其中包含两个类AB.

class A(object):
    def method_a(self):
        return "Class A method a"

class B(object):
    def method_b(self):
        a = A()
        print a.method_a()
Run Code Online (Sandbox Code Playgroud)

我想通过嘲笑method_b在课堂上B进行单元测试A.以下是testa.py用于此目的的文件内容:

import unittest
import mock
import a


class TestB(unittest.TestCase):

    @mock.patch('a.A')
    def test_method_b(self, mock_a):
        mock_a.method_a.return_value = 'Mocked A'
        b = a.B()
        b.method_b()


if __name__ == '__main__':
    unittest.main()
Run Code Online (Sandbox Code Playgroud)

我希望得到Mocked A输出.但我得到的是:

<MagicMock name='A().method_a()' id='4326621392'>
Run Code Online (Sandbox Code Playgroud)

我哪里做错了?

python python-unittest magicmock

57
推荐指数
1
解决办法
3万
查看次数

模拟整个python类

我正在尝试在python中进行一个简单的测试,但我无法弄清楚如何完成模拟过程.

这是类和def代码:

class FileRemoveOp(...)
    @apply_defaults
    def __init__(
            self,
            source_conn_keys,
            source_conn_id='conn_default',
            *args, **kwargs):
        super(v4FileRemoveOperator, self).__init__(*args, **kwargs)
        self.source_conn_keys = source_conn_keys
        self.source_conn_id = source_conn_id


    def execute (self, context)
          source_conn = Connection(conn_id)
          try:
              for source_conn_key in self.source_keys:
                  if not source_conn.check_for_key(source_conn_key):    
                      logging.info("The source key does not exist")  
                  source_conn.remove_file(source_conn_key,'')
          finally:
              logging.info("Remove operation successful.")
Run Code Online (Sandbox Code Playgroud)

这是我对执行功能的测试:

@mock.patch('main.Connection')
def test_remove_execute(self,MockConn):
    mock_coon = MockConn.return_value
    mock_coon.value = #I'm not sure what to put here#
    remove_operator = FileRemoveOp(...)
    remove_operator.execute(self)
Run Code Online (Sandbox Code Playgroud)

由于execute方法尝试建立连接,我需要模拟,我不想做一个真正的连接,只是返回一些mock.我该怎么做?我习惯用Java做测试,但我从来没有在python上做过..

python unit-testing magicmock

13
推荐指数
1
解决办法
8996
查看次数

Python模拟补丁不能像公共方法那样工作

我正在尝试为我的烧瓶应用程序修补一个公共方法,但它似乎不起作用.

这是我的代码 mrss.feed_burner

def get_feed(env=os.environ):
   return 'something'
Run Code Online (Sandbox Code Playgroud)

这就是我使用它的方式

@app.route("/feed")
    def feed():
        mrss_feed = get_feed(env=os.environ)
        response = make_response(mrss_feed)
        response.headers["Content-Type"] = "application/xml"

        return response
Run Code Online (Sandbox Code Playgroud)

这是我的测试,它没有解析.

def test_feed(self):
    with patch('mrss.feed_burner.get_feed', new=lambda: '<xml></xml>'):
        response = self.app.get('/feed')
        self.assertEquals('<xml></xml>', response.data)
Run Code Online (Sandbox Code Playgroud)

python unit-testing mocking flask magicmock

9
推荐指数
1
解决办法
2506
查看次数

首次通话后抛出异常

我有一个循环,我处理将记录添加到zip文件.我已经模拟了我的zipfile对象,我想提出一个异常来验证我处理大型zip文件的逻辑是否能正常工作.

有没有办法让MagicMocks或普通模拟接受第一次调用,但是在第二次调用时引发异常?

python django mocking magicmock

7
推荐指数
2
解决办法
2228
查看次数

python检查是否调用了一个方法而不嘲笑它

class A():
    def tmp(self):
        print("hi")

def b(a):
    a.tmp()
Run Code Online (Sandbox Code Playgroud)

要检查是否在b中调用了tmp方法,推荐的方法是

a = A()
a.tmp = MagicMock()
b(a)
a.tmp.assert_called()
Run Code Online (Sandbox Code Playgroud)

但是这里的tmp被嘲笑了,并没有导致"hi"被打印出来。

我希望我的单元测试可以检查方法tmp是否被调用而不会模拟它。

这可能吗?

我知道在编写unitest时这不是标准的事情。但是我的用例(有点棘手)需要这样做。

python unit-testing mocking python-3.x magicmock

7
推荐指数
1
解决办法
1612
查看次数

模拟文件在python中打开

我正在尝试模拟文件打开,所有示例都显示我需要

@patch('open', create=True) 
Run Code Online (Sandbox Code Playgroud)

但我一直在

Need a valid target to patch. You supplied: 'open'
Run Code Online (Sandbox Code Playgroud)

我知道补丁需要完整的虚线路径open,但我不知道它是什么.事实上,我甚至不确定这是什么问题.

python unit-testing mocking magicmock

6
推荐指数
2
解决办法
1万
查看次数

如何模拟属性以引发异常?

我在 Python 2.7 中使用 MagicMock 来模拟对象。我嘲笑的类之一具有属性,其中之一TypeError在某些情况下可以引发 a 。

我想嘲笑这种行为,但我不知道如何:

  • del my_mock.my_property将导致访问AttributeErrorif my_property,但我需要一个TypeError.
  • my_mock.my_property = MagicMock(side_effect=TypeError)导致一个TypeErrorwhenmy_property调用,但不是当它仅仅被访问时。

我该怎么做?

python unit-testing mocking python-2.7 magicmock

6
推荐指数
1
解决办法
2455
查看次数

扩展 MagicMock 类时出现 AttributeError: _mock_methods

是否可以扩展 MagicMock 类来创建模拟对象并在单元测试中使用它?

如果我在 init 函数中没有任何代码,则扩展类似乎效果很好

class MockAPI(MagicMock):

    def __init__(self):
        self.x = 20

    def mocked_method(self, param):
        return not param


class TestX(TestCase):
    def setUp(self) -> None:
        self.mocked_api = MockAPI()

    def test_another_method(self):
        self.assertTrue(True)
Run Code Online (Sandbox Code Playgroud)

但这会引发以下错误:

  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/unittest/case.py", line 59, in testPartExecutor
    yield
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/unittest/case.py", line 611, in run
    self.setUp()
  File "/Users/user/project/tests/test_protocols.py", line 46, in setUp
    self.mocked_api = MockAPI()
  File "/Users/user/project/tests/test_protocols.py", line 38, in __init__
    self.x = 20
  File "/Users/user/project/venv/lib/python3.7/site-packages/mock/mock.py", line 736, in __setattr__
    elif (self._spec_set and self._mock_methods is not None and
  File "/Users/user/project/venv/lib/python3.7/site-packages/mock/mock.py", …
Run Code Online (Sandbox Code Playgroud)

python python-unittest magicmock

6
推荐指数
1
解决办法
1500
查看次数

MagicMock 和包装

为什么“wraps”关键字对于 MagicMock 对象的作用不一致?普通方法会传递到包装对象,但不会传递“特殊”方法。在下面的测试中,第一个断言通过,第二个断言失败。

import mock
import unittest


class Foo(object):
    def bar(self):
        return 1

    def __len__(self):
        return 3


class TestWrap(unittest.TestCase):
    def test(self):
        foo = Foo()
        c = mock.MagicMock(wraps=foo)
        assert c.bar() == 1 # Passes
        assert len(c) == 3 # Fails
Run Code Online (Sandbox Code Playgroud)

我在文档中找不到任何表明这一点的内容。我错过了什么吗?

python mocking python-unittest magicmock

5
推荐指数
1
解决办法
3700
查看次数

将整数与在 python 中的单元测试中不起作用的 MagicMock 进行比较

我有一个类,它使用类变量来选择要执行的逻辑。

#in file1:

class SomeHelper():
    def __init__(self):
        self.my_var = 0

#in file2: 
import file1
class MyClass():
    ...
    ...
    def calculate():
        inst = file1.SomeHelper()
        if x > inst.my_var:
           etc etc
Run Code Online (Sandbox Code Playgroud)

我正在编写一个单元测试并在另一个文件中模拟 SomeHelper():

from file 2 import MyClass
# tried both
@patch('file2.file1') OR @patch('file2.file1.SomeHelper')
def test_calculate(self, mock_helper):
    mock_helper.my_var = 0
    to_test = MyClass.calculate()
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

类型错误:“MagicMock”和“int”的实例之间不支持“>”。

我以为我是my_var在修补模块后定义的。

python mocking python-unittest magicmock

5
推荐指数
1
解决办法
7776
查看次数