当前位置: 首页 > 面试题库 >

模拟出任何python类实例上的方法

云文栋
2023-03-14
问题内容

我想在生产代码中模拟某个类的任何实例的方法,以便于测试。Python中是否有任何库可以简化此过程?

基本上,我想执行以下操作,但是在Python中(以下代码是Ruby,使用Mocha库):

  def test_stubbing_an_instance_method_on_all_instances_of_a_class
    Product.any_instance.stubs(:name).returns('stubbed_name')
    assert_equal 'stubbed_name', SomeClassThatUsesProduct.get_new_product_name
  end

从上面需要注意的重要一点是,我需要在类级别上对其进行模拟,因为实际上我需要对我正在测试的事物创建的实例上的方法进行模拟。

用例:

我有一个类QueryMaker,它在的实例上调用方法RemoteAPI。我想模拟出RemoteAPI.get_data_from_remote_server返回常量的方法。我如何在测试中执行此操作,而不必在RemoteAPI代码中放入特殊情况以检查其运行在什么环境中。

我想要行动的示例:

# a.py
class A(object):
    def foo(self):
        return "A's foo"

# b.py
from a import A

class B(object):
    def bar(self):
        x = A()
        return x.foo()

# test.py
from a import A
from b import B

def new_foo(self):
    return "New foo"

A.foo = new_foo

y = B()
if y.bar() == "New foo":
    print "Success!"

问题答案:

最简单的方法可能是使用类方法。您确实应该使用实例方法,但是创建它们很麻烦,而内置函数可以创建类方法。使用类方法,您的存根将获得对类(而不是实例)的引用作为第一个参数,但是由于它是存根,因此这可能无关紧要。所以:

Product.name = classmethod(lambda cls: "stubbed_name")

请注意,lambda的签名必须与您要替换的方法的签名匹配。另外,当然,由于Python(例如Ruby)是一种动态语言,因此无法保证有人在您获得实例之前不会将您的存根方法切换为其他方法,尽管我希望您很快就会知道如果发生这种情况。

编辑:在进一步调查中,您可以省略classmethod()

Product.name = lambda self: "stubbed_name"

我试图尽可能地保留原始方法的行为,但实际上似乎并不是必需的(无论如何也不会保留我所希望的行为)。



 类似资料:
  • 我试图模拟一个单例类(SessionDataManager),通过调用静态getInstance()方法获得一个实例,但所有尝试似乎都返回null。 我试过了

  • 问题内容: 我正在尝试使用富有想象力的Mock测试库测试Django应用程序时模拟某些东西。我似乎无法完全正常工作,我正在尝试这样做: 我究竟做错了什么? 问题答案: 啊,我对在哪里应用该补丁装饰感到困惑。固定:

  • 我试图为一个类编写一个单元测试,这个类使用带有库中的的Google vision API。问题是,由于某种原因,我的模拟仍然调用真正的方法,然后抛出一个NPE,这破坏了我的测试。我以前从未在模拟上见过这种行为,我想知道我是不是做错了什么,是不是Spock/Groovy中有bug,还是与Google lib有关?

  • 本文向大家介绍python模拟Django框架实例,包括了python模拟Django框架实例的使用技巧和注意事项,需要的朋友参考一下 一、python实现web服务器 web开发首先要有web服务器才行。比如apache,但是在开发阶段最好有一个简单方便的开发服务器, 容易重启进行调试,等开发调试完毕后,再将代码部署到成熟稳定高效的web服务器。 执行上面这个程序后,打开浏览器,访问一个以 ht

  • 本文向大家介绍JS模拟的Map类实现方法,包括了JS模拟的Map类实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS模拟的Map类。分享给大家供大家参考,具体如下: 根据java中map的属性,实现key----value保存 1、使用数组方式存储数据,(使用闭包) 2、使用JSON方式存储数据(使用原型方式拓展方法) 更多关于JavaScript相关内容感兴趣的读者可查看本站专

  • 例如,我有处理程序: 但是当我试图模拟它时,它实际上调用。如何使用来模拟它的方法?