社区首页 >问答首页 >如何使用flexmock模拟被测模块中的类或对象

如何使用flexmock模拟被测模块中的类或对象
EN

Stack Overflow用户
提问于 2020-04-04 15:01:39
回答 1查看 126关注 0票数 1

我想在我正在测试的周围函数体中模拟一个函数调用。我需要用flexmock来做这件事,或者至少知道这是不可能的。以下面这段代码为例。我有3个文件。具有单个函数run_command的utils.py和具有具有单个方法test_api.py的类的api.py。所有这些都是出于演示目的,并不是特别有用,但应该能够描述我的问题

代码语言:javascript
代码运行次数:0
复制
# util.py
import subprocess

def run_command(cmd):
    return subprocess.check_output(cmd)

现在api.py将使用来自util.py的run_command

代码语言:javascript
代码运行次数:0
复制
# api.py
from util import run_comand


class Api:

    def get_update(self):
        result = run_command(["pwd"]).decode("utf-8")
        return f"Update: {result}"

现在,我想为Api.get_update编写一个测试,但并不想实际执行run_command

使用mock模块,我可以像这样编写测试

代码语言:javascript
代码运行次数:0
复制
# test_api.py
from unittest import mock

@mock.patch("api.run_command")
def test_get_update(run_command_mock):
    run_command_mock.return_value = b"sucess!!!"
    api = Api()
    result = api.get_update()
    assert result == "Update: success!!!"

上述测试的效果与预期一致。当get_update被调用时,它实际上并不执行run_command。它使用的是模拟版本。现在我想用flexmock来做这件事。不过,我不知道这是否可能。只是我正在为一个项目做贡献,所有的测试都是用flexmock构建的,所以我想遵循同样的模式。不幸的是,我找不到一个能解决类似问题的测试。从这个SO mocking-functions-with-flexmock-in-python,我想到了这个

代码语言:javascript
代码运行次数:0
复制
import utils as utils_module
import flexmock
from api import Api

def test_get_update():
    flexmock(utils_module).should_receive("run_command").with_args(["pwd"]).once().and_return("success!!")
    api = Api()
    result = api.get_update()
    assert result == "Update: success!!!"

上述测试失败。utils中的run_command仍然会执行,而不是我的模拟版本。如何使用flexmock修复此问题?

EN

回答 1

Stack Overflow用户

发布于 2020-04-05 09:50:47

我发现我做错了什么。我是从它的来源而不是像我在@mock.patch中使用它的地方嘲笑run_command的。为了修复它,我不得不像这样重写我的测试

代码语言:javascript
代码运行次数:0
复制
import flexmock import flexmock
import api as api_module # Instead of importing utils, I'm importing api since that's where run_command is called even though it's coming from utils


def test_get_update():
    flexmock(api_module).should_receive("run_command").once().and_return(b"success!!!")
    api = api_module.Api()
    result = api.get_update()
    assert result == "Update: success!!!"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61030024

复制
相关文章
Java 类和对象,如何定义Java中的类,如何使用Java中的对象,变量
6.类与对象方法,属性的联系和区别:类是一个抽象的概念,仅仅是模板,比如:“手机”对象是一个你能够看得到,摸得着的具体实体
用户7886150
2021/01/31
6.9K0
在 Vue 对象模块内如何使用 this 对象?
众所周知,js 中的 this 对象在不同作用域下指代不同的对象实例,并且在以下 4 种场景中经常会“不知所向”:
LIYI
2019/09/02
2.7K0
PHP检查对象或类中是否存在属性
$obj = \app\common\library\Email::instance(); $obj->p=889; if(isset($obj->p)){ echo 66; }else{ echo 99; } die; isset既可以判断对象的属性是否存在,也可以判断数组的键名是否存在 未经允许不得转载:肥猫博客 » PHP检查对象或类中是否存在属性
超级小可爱
2023/02/20
4.2K0
如何理解python中的类和对象?
本系列课程是针对无基础的,争取用简单明了的语言来讲解,学习前需要具备基本的电脑操作能力,准备一个已安装python环境的电脑。如果觉得好可以分享转发,有问题的地方也欢迎指出,在此先行谢过。
叶子陪你玩
2020/03/23
2.1K0
如何理解python中的类和对象?
习题34:模块,类,对象
创建一个名字叫mystuff.py文件,并且在里面放了个叫做apple的函数,代码如下
py3study
2018/08/02
3170
Python使用模块中对象的几种方法
Python默认安装仅包含部分基本或核心模块,启动时也仅加载了基本模块,在需要时再显式地加载(有些模块可能需要先安装)其他模块,这样可以减小程序运行的压力,且具有很强的可扩展性。Python中导入模块的方法主要有: (1)import 模块名 [as 别名] 使用这种方式导入以后,使用时需要在对象之前加上模块名作为前缀,也就是必须以“模块名.对象名”的方式进行访问。也可以为导入的模块设置一个别名,然后就可以使用“别名.对象名”的方式来使用其中的对象了。 >>> import math >>> math.si
Python小屋屋主
2018/04/16
1.2K0
JVM中如何判断对象可以被回收?
JVM 的垃圾回收器主要关注的是堆上创建的实例对象,在每次对这些对象进行回收前,需要确定哪些对象是可以去进行回收的。
用户3596197
2019/01/28
1.4K0
JVM中如何判断对象可以被回收?
在Java中,一个对象是如何被创建的?又是如何被销毁的?
总结起来,一个对象的创建过程包括内存分配、对象头信息设置、实例变量初始化、构造方法调用和返回对象引用。这个过程确保了对象被正确地创建和初始化,以便在后续的程序执行中使用。
一凡sir
2023/07/24
4540
如何在 Linux 中找出最近或今天被修改的文件
Linux 用户在命令行上遇到的常见问题之一是定位具有特定名称的文件,如果你知道确定的文件名则可能会容易得多。
用户8851537
2021/07/26
3.4K0
Python 导入模块中的类
在看代码时发现Python的导入类也可以用“.”的方式,很是惊奇,记录下来: 如以下代码:其所在文件(模块)为test.py
用户7886150
2020/12/24
2.3K0
【游戏开发】在Lua中实现面向对象特性——模拟类、继承、多态
  Lua是一门非常强大、非常灵活的脚本语言,自它从发明以来,无数的游戏使用了Lua作为开发语言。但是作为一款脚本语言,Lua也有着自己的不足,那就是它本身并没有提供面向对象的特性,而游戏开发是一项庞大复杂的工程,如果没有面向对象功能势必会为开发带来一定的不便。不过幸好Lua中有table这样强大的数据结构,利用它再结合元表(metatable),我们便可以很方便地在Lua中模拟出类、继承和多态等面向对象编程具有的特性。
马三小伙儿
2018/09/12
3K0
OC中的类和对象
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/46784517
用户1451823
2018/09/12
9710
python中的类和对象
学了python的基本类型, 语法以及常见模块, 这篇来学习一下python中的类和对象, 不做过多的解释和难以理解的文字, 简单的举一些小例子, 写一些示例代码来说明应该如何写类, 以及实例对象, 后面会随着对python的熟悉度会对类和对象有更深的理解, 学到这里之后, 就可以写一些比较像样的python脚本了, 如果你是从第一篇看到这里, 不得不说, 你很棒, 加油!!!!!!
不止于python
2023/09/05
1990
python中的类和对象
Python中的类、对象、继承
上述访问级别更多的是一种编程约定,即便是以双下划线开头的字段,在类的外部也是可以访问的,但不建议这么做。示例代码如下:
雪飞鸿
2018/09/05
2.3K0
Python中的类、对象、继承
关于如何在Python中使用静态、类或抽
Python中方法的工作方式 方法是存储在类属性中的函数,你可以用下面这种方式声明和访问一个函数 >>> class Pizza(object): ... def __init__(self, size): ... self.size = size ... def get_size(self): ... return self.size ... >>> Pizza.get_size <unboun
py3study
2020/01/19
7200
如何使用MLSQL中的帮助指令学习模块的使用
MLSQL 已经实现了文章中描述的功能 如何实现语法的自解释(MLSQL易用性设计有感) 。
用户2936994
2018/09/29
9430
如何使用MLSQL中的帮助指令学习模块的使用
数组或对象中的内容间隔显示
总结:间隔显示,不要使用for 循环,原因是for循环是同步,setTimeout是异步,同步执行完再执行异步。
tianyawhl
2019/11/07
4.3K0
面向对象类的使用(15)
本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新,包括别的语言以及实战都将使用对话的方式进行教学,基础编程语言教学适用于零基础小白,之后实战课程也将会逐步更新。
1_bit
2022/01/06
2680
面向对象类的使用(15)
机器人变身(类与对象)【期中模拟】
编写一个机器人类,包含属性有机器名、血量、伤害值、防御值、类型和等级。其中血量、伤害和防御和等级、类型相关:
叶茂林
2023/07/30
1790
点击加载更多

相似问题

被测类中的模拟类

30

被测对象的模拟方法

14

导入被测模块的模拟方法

20

被测类的模拟依赖关系

41

在Moq中模拟被测对象的方法?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文