- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下配置类:
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/
在 Python3.4 中: >>> import mock.MagicMock >>> type(mock.MagicMock()) == mock.MagicMock False # Huh, w
我正在迁移我的项目的 python 版本 (2->3)。测试对 python2 工作正常,但对 python3 提示,错误就像 TypeError: '>' not supported between
为什么“wraps”关键字不能始终对 MagicMock 对象起作用?普通方法传递给包装对象,但不是“特殊”方法。在下面的测试中,第一个断言通过,第二个断言失败。 import mock import
( python 2.6) 我有一个方法: def send_all(self, messages): for message in messages: queue.send(
我运行了一个快速测试,看看是否有什么工作...... >>> from unittest.mock import MagicMock >>> x = MagicMock() >>> x.func.re
假设有人在python文件的头部将模块设置为MagicMock: sys.modules['moduleABC'] = mock.MagicMock() 这会引起麻烦,因为当我尝试运行整个单元测试列表
我有以下配置类: class ConfigB(object): Id = None def __Init__(self, Id): self.Id = Id 它在以下类中实例化并打印属
(Python 2.6) 我在 MagicMock 修补中遗漏了一些东西 给出以下生产代码: class MyQueue(object): def send(self, message):
我想在 Python 测试中模拟一个方法。为此,我需要 MagicMock,我尝试像这样导入它: from unittest import TestCase from unittest.mock im
我想为测试对象模拟一些不重要的函数(其他函数)- time.sleep() 等 我可以用简单的模拟替换它们,这会起作用。但是我希望它在使用错误数量的参数调用时报告错误,没有命名参数等。 有什么方法可以
我想做的是这个... x = MagicMock() x.iter_values = [1, 2, 3] for i in x: i.method() 我正在尝试为此函数编写单元测试,但我不确
我正在设置一个 MagicMock 实例,使用不同的参数调用相同的方法两次,并将我的断言设置为仅验证一组参数。 Python:3.5.2 from unittest.mock import Magic
我是使用 MagicMock 在 python 中进行单元测试的新手。我有以下代码来断言 python 中正确的方法计数: def methodFoo(self): for booOb
在 Python 中,如果您调用一个不存在的方法,它会抛出一个 AttributeError。例如 >>> class A: ... def yo(self): ...
例如: import mock class MyClass(object): def foo(self, x, y, z): return (x, y, z) class Te
mock( http://mock.readthedocs.org/en/latest/index.html ) 是 python 中用于单元测试的好工具。它可以方便地模拟一个方法或类或字典。但是我遇
我们正在模拟一个 3rd 方模块,它有一个带有许多嵌套实例的大型 api。它的各种对象通常通过属性、get() 或字典索引 [] 访问。拥有一个将所有 3 个都视为简单属性访问的灵活模拟将非常方便。
我们正在模拟一个 3rd 方模块,它有一个带有许多嵌套实例的大型 api。它的各种对象通常通过属性、get() 或字典索引 [] 访问。拥有一个将所有 3 个都视为简单属性访问的灵活模拟将非常方便。
我无法让我的测试按预期运行。我试图模拟两个属性的返回值和一个测试的方法,但我没有得到所需的返回值,而是得到了一个 MagicMock 对象。 我不知道该怎么做。最让我恼火的是,模拟该方法可以按预期工作
我正在尝试为 Readthedocs 自动生成文档。我将一些依赖项模拟为 they suggest in FAQ ,但是从函数的类型注释中,我得到了文档的某些部分,看起来像 Return type:
我是一名优秀的程序员,十分优秀!