gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:55:37 26 4
gpt4 key购买 nike

我有以下配置类:

class ConfigB(object):
Id = None

def __Init__(self, Id):
self.Id = Id

它在以下类中实例化并打印属性:

from config.ConfigB import ConfigB

class FileRunner(object):
def runProcess(self, Id)
cfgB = ConfigB(Id)
print(cfgB.Id)

我创建了以下测试类来测试它,我试图在其中模拟实例化和 cfgB.Id 属性调用:

import unittest
import unittest.mock imort MagicMock
import mock
from FileRunner import FileRunner

class TestFileRunner(unittest.TestCase):
@mock.patch('ConfigB.ConfigB.__init__')
@mock.patch('ConfigB.ConfigB.Id')
def test_methodscalled(self, cfgBId, cfgBInit):


fileRunner = FileRunner()

cfgBId.return_value = 17

cfgBInit.return_value = None

print(cfgBId)

fileRunner.runProcess(1)

请注意调用 fileRunner 之前的 print(cfgBId) 语句。我得到以下输出:

<MagicMock name='Id' id='157297352'>
<MagicMock name='Id' id='157297352'>

出于某种原因,当我在测试类中设置返回值时:

cfgBId.return_value = 17

这不会在 FileRunner() 类中被调用:

print(cfgB.Id)

我需要做什么才能正确显示我的配置属性?

另请注意,我的“ConfigB”类实例化比上面显示的要复杂得多,这就是为什么我想修补实例化和对 Id 属性的调用。

*更新:我已经按照@mgilson的建议更改了我的类(class),但它仍然不起作用:

import unittest
import unittest.mock imort MagicMock
import mock
from FileRunner import FileRunner

class TestFileRunner(unittest.TestCase):
@mock.patch('FileRunner.ConfigB')
def test_methodscalled(self, cfgB):

fileRunner = FileRunner()

cfgB.Id = 17

print(cfgBId)

fileRunner.runProcess(1)

我现在从两个 print 语句中获得以下输出:

<MagicMock name='ConfigB' id='157793640'>
<MagicMock name='ConfigB().Id' id='157020512'>

您知道为什么上述方法不起作用吗?

*解决方案:

在对 @mgilson 建议的测试方法进行微小更改后,我能够使其正常工作:

import unittest
from unittest.mock import MagicMock
import mock
from FileRunner import FileRunner

class TestFileRunner(unittest.TestCase):
@mock.patch('FileRunner.ConfigB')
def test_methodscalled(self, configB):

fileRunner = FileRunner()

cfgB = MagicMock()
cfgB.Id = 17
#This will return the cfgB MagicMock when `ConfigB(Id)` is called in `FileRunner` class
configB.return_value = cfgB

print(cfgB.Id)

fileRunner.runProcess(1)

#To test whether `ConfigB(17)` was called
configB.assert_called_with(17)

我现在得到以下输出:

<MagicMock name='ConfigB' id='157147936'>
17

最佳答案

在我看来,最好替换 FileRunner 命名空间中的整个 ConfigB 对象。然后你的测试看起来像这样:

import unittest
import unittest.mock imort MagicMock
import mock
from FileRunner import FileRunner

class TestFileRunner(unittest.TestCase):
@mock.patch('FileRunner.ConfigB')
def test_methodscalled(self, cfgB):
fileRunner = FileRunner()
cfgB.return_value.Id = 17
fileRunner.runProcess(1)

请注意,@mock.patch('FileRunner.ConfigB') 会将 FileRunner 命名空间中的 ConfigB 类替换为 mock 。然后,您可以配置模拟来执行您喜欢的任何操作 - 例如Id 等于 17。

关于python - 模拟属性调用返回 MagicMock,而不是值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44592535/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com