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

带有多次调用方法的Python Mock对象

长孙阳焱
2023-03-14
问题内容

我有一个正在测试的类,该类具有依赖关系的另一个类(该类的实例被传递给CUT的init方法)。我想使用Python Mock库来模拟此类。

我所拥有的是这样的:

mockobj = Mock(spec=MyDependencyClass)
mockobj.methodfromdepclass.return_value = "the value I want the mock to return"
assertTrue(mockobj.methodfromdepclass(42), "the value I want the mock to return")

cutobj = ClassUnderTest(mockobj)

没关系,但是“
methodfromdepclass”是参数化的方法,因此我想创建一个单独的模拟对象,其中根据将哪些参数传递给methodfromdepclass来返回不同的值。

我想要这种参数化行为的原因是,我想创建ClassUnderTest的多个实例,这些实例包含不同的值(其值由从嘲笑对象返回的值产生)。

Kinda我在想什么(这当然行不通):

    mockobj = Mock(spec=MyDependencyClass)
    mockobj.methodfromdepclass.ifcalledwith(42).return_value = "you called me with arg 42"
    mockobj.methodfromdepclass.ifcalledwith(99).return_value = "you called me with arg 99"

    assertTrue(mockobj.methodfromdepclass(42), "you called me with arg 42")
    assertTrue(mockobj.methodfromdepclass(99), "you called me with arg 99")

    cutinst1 = ClassUnderTest(mockobj, 42)
    cutinst2 = ClassUnderTest(mockobj, 99)

    # now cutinst1 & cutinst2 contain different values

如何实现这种“ ifwithwith”语义?


问题答案:

尝试 side_effect

    def my_side_effect(*args, **kwargs):
        if args[0] == 42:
            return "Called with 42"
        elif args[0] == 43:
            return "Called with 43"
        elif kwargs['foo'] == 7:
            return "Foo is seven"

    mockobj.mockmethod.side_effect = my_side_effect


 类似资料:
  • 我在使用Java方法时遇到了麻烦。这段代码应该有三种方法。方法1)输入员工人数。方法2)输入每个员工缺勤天数。方法3)计算缺勤天数的平均值。然后,在Main中,应该打印员工人数、缺勤天数和平均缺勤天数。显然,我不明白方法是如何工作的,因为当我运行代码时,用户在提供员工人数、缺勤天数和平均缺勤天数之前,会被询问4倍的员工人数和2倍的员工缺勤天数。如何更改代码,以便用户只需输入一次信息?

  • 问题内容: 我想我在这里描述的可能有个名字,但我不知道。所以我的第一个问题是要知道这种技术的名称。 这是一个示例:假设您正在网页上实现实时搜索。每次用户在搜索框中键入内容时,您都会触发一个新的搜索查询,并且结果会尽可能频繁地更新。这是一件愚蠢的事情,因为您发送的查询会超出实际需要。每2-3个字母发送一次请求,或者每100 ms最多发送一次请求就足够了。 因此,一种技术是安排在键入键之后立即执行的查

  • 我们正在从SQLite db加载大量数据,并使用IntentService。 有一个活动在加载完成时从IntentService接收广播。当试图在IntentService完成之前启动活动时,方法会被多次调用。 sendPersonListBroadcast();

  • 所以我有一个用于片段的容器,称为“容器”,它是一个FrameLayout。 在这个容器中,我使用名为CollectionsFragment的视页放置了一个片段。 null 我正在使用一个FragmentStatePagerAdapter,并将CollectionsFragment的getChildFragmentManager()传递给适配器。 我还有一个用于活动容器的onBackstackCha