未记录模拟对象的初始化

时间:2018-12-09 00:18:26

标签: python unit-testing mocking pytest

我正在尝试测试类的构造函数的成功调用,但未将其记录在我的Mock对象中。我正在使用pytestpytest-mock库分别进行单元测试和模拟。

想象一下,我在cryptocurrency模块的transaction.py包中有以下类:

class Transaction:
    def __init__(self, test):
        self.test = test

然后在tests模块的另一个软件包test_transaction.py中进行以下测试:

def test_constructor(mocker):
    mock_transaction = mocker.patch('cryptocurrency.transaction.Transaction', 
        autospec=True)
    Transaction('123')
    mock_transaction.assert_called_once()

为什么测试失败并显示以下消息:

AssertionError: Expected 'Transaction' to have been called once. Called 0 times.

模拟对象不是要监听类实例的初始化并记录吗?

编辑:我已经回答了这个问题,但是我还有另一个类似的情况仍然无法解决。想象一下,类Transaction也具有以下方法:

@classmethod
def new_transaction(cls, test)
    return cls(test)

并且测试是:

def test_new_transaction(mocker):
    mock_transaction = mocker.patch('cryptocurrency.transaction.Transaction', 
        autospec=True)
    Transaction.new_transaction('123')
    mock_transaction.assert_called_once()

我无法正常工作。我已经尝试按照建议的答案将补丁程序更改为__name__ + 'Transaction',但仍然无法正常工作。我觉得我的初始解决方案应该是正确的解决方案,因为即使测试引用了某个Transaction导入,new_transaction()方法仍将与Transactiion上的原始cryptocurrency.transaction.Transaction进行交互。

0 个答案:

没有答案