我应该如何用mock测试python unbound方法?

时间:2016-10-05 16:05:52

标签: python mocking pytest

我有一些python类

Class A(object):

    def __init__(self, dep1, dep2, *args, **kwargs):
        self.prop1 = dep1
        self.prop2 = dep2

    def method1(self):
        self.prop3 = self.prop1.make_action()
        return

我需要从A级测试A.method1。 我就是这样做的:

import pytest
import mock

def test__method1():
    """Ensure prop3 has been set from a.prop1.make_action() returned value"""
    a = mock.MagicMock(spec=A)
    a.prop1 = mock.Mock()
    a.prop2 = mock.Mock()
    a.prop1.make_action.return_value = "val1"
    A.method1(a)
    assert a.prop1.make_action.call_count == 1
    assert a.prop3 == "val1"

这是进行像这样的测试的最好方法,还是我做错了什么? 添加: 首先,我尝试像这样调用method1:

a.method1 = A.method1
a.method1()

但它没有用。
现在我还需要明确地模拟 a.prop1 a.prop2 。但在某些情况下,如果我没有设置 spec 属性,我不需要模拟prop1和prop2,它们已经在这里了。这些是我提出这个问题的原因

1 个答案:

答案 0 :(得分:0)

现在我这样做:

@pytest.fixture
def instance_of_a():
    a = mock.Mock(A)
    a.prop1 = mock.Mock()
    a.prop2 = mock.Mock()
    a.prop1.make_action.return_value = "val1" 
    return a

def test__a_method1(instance_of_a):
    A.method1(instance_of_a)
    assert instance_of_a.prop1.call_count == 1
    assert instance_of_a.prop3 == "val1"