Python:在不添加返回值的情况下获取返回的模拟函数值,而不是 MagicMock

罗宾·卡斯特隆

所以,基本上我想模拟一个在另一个类中导入的函数,由于某种原因,我无法在不调用模拟的返回值的情况下检索模拟结果。

这是设置:一个文件,一个模块,一个测试类。我想在 source.fileB 中模拟 functionB()。

源文件B

def functionB():
    print('toto')

源文件A

from source.fileB import *

def functionA():
    print("bar")
    return functionB()

测试用例

from source.fileA import functionA
from source.fileA import functionB

@mock.patch('source.fileA.functionB')
def test_functionA(functionB_mock):
 functionB_mock().returnvalue = "foo"

 print(functionB_mock) # prints MagicMock object named functionB
 print(functionB_mock.returnvalue) # prints MagicMock object name functionB.returnvalue
 print(functionB_mock().returnvalue) #prints "foo"
 print(functionA().returnvalue) #executes functionA, prints both "bar" and "foo"
 print(functionA()) #executes functionA, prints both "bar" and MagicMock object named functionB()

因此,每次我尝试获取模拟的 functionB() 的结果时,都必须使用返回值。这让我发疯,因为我无法更新 functionA()

return functionB().returnvalue

为了让被测代码的其余部分正确执行。我一定是做错了什么,但我无法准确理解是什么。

山姆怀斯

有两个问题:

  1. 你想要的模拟属性是return_value,不是returnvalue
  2. 您需要在模拟本身上设置该属性,而不是调用模拟(这是一个不同的模拟)的结果。

这是带有修复程序和一些解释性注释的测试代码的独立(单文件)版本。

import mock


def functionB():
    print('toto')


def functionA():
    print("bar")
    return functionB()


@mock.patch('__main__.functionB')
def test_functionA(functionB_mock):
    functionB_mock.return_value = "foo"

    # Prints a mock object because that's what functionB_mock is.
    print(functionB_mock)

    # Prints another MagicMock object because every
    # attribute of a mock is another mock.
    print(functionB_mock.return_value)

    # The following two lines would raise AttributeError because
    # "foo" isn't a Mock and doesn't have a 'return_value' attribute!
    # print(functionB_mock().return_value)
    # print(functionA().return_value)

    # Executes functionA, prints "bar" and "foo"
    print(functionA())


test_functionA()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

模拟返回MagicMock的属性调用,而不是值

MagicMock基于输入的返回值

模拟urllib.request.urlopen的read函数返回MagicMock签名

使用MagicMock在Python中嵌套模拟导入

Python返回MagicMock对象而不是return_value

在 Python 中使用 MagicMock 时遇到的问题

Python模拟,预期的str实例MagicMock已找到

MagicMock响应以在python 3.x中获取数据

在基于类的视图中模拟表单不使用MagicMock

如何在不评估函数的情况下获取函数返回值的维数

如何让python的MagicMock在第一次调用时返回一个值,并在第二次调用时引发异常?

如何在不运行方法的情况下模拟方法调用并返回值?

MagicMock @patch无法正常工作

在 Pytest 中处理 MagicMock 转换

如何在不破坏原有代码的情况下增加函数的返回值?

Python-如何在不更改原始值的情况下从类返回值

在这种情况下如何使用 python/selenium 将返回值传递给函数?

Django信号内部未调用MagicMock

可以对MagicMock对象进行迭代吗?

如何强制MagicMock复制功能签名?

将 SQLAlchemy `and_` 与 MagicMock 结合使用

How to override __getitem__ on a MagicMock subclass

JavaScript异步函数,当没有返回值的情况下,返回时应答应解决

获取 undefined 而不是函数的返回值

创建充当类对象的 MagicMock,并在实例化时创建一个 MagicMock 实例

C++ 程序在不运行某些行的情况下以某些返回值退出?

如何在不运行for循环的情况下使类的iter方法返回值?

C++ | 如何在不每次都返回值的情况下循环 if 语句

python函数不返回值