嘲笑一个类:赶上22

时间:2018-03-02 16:01:33

标签: python unit-testing mocking

简要总结

beforeEach(() => { wrapper = shallow(GridContainer, { propsData: { userId, managerId } }) wrapper.setData({pageSize: count}) }) 调用MyClass.my_method我想创建一个模拟器,因此instance = SomeLibrary()是一个我可以控制的模拟对象。本着孤立测试的精神,我实际上并不想打电话给instance

传递给SomeLibrary

的参数

我正在尝试模拟类构造函数,但我还没弄明白要传递给@ mock.patch()装饰器的内容。文档说该参数必须完全点缀(@mock.patch()),但pyftdi.ftdi.Ftdi文档说该参数必须与被测试代码所知的名称相匹配(where to patch)。我不知道如何满足两者。

为了使其具体,这是正在测试的文件:

Ftdi

...和测试文件

from pyftdi.ftdi import Ftdi

class FtdiInterface(object):
    @classmethod
    def set_power(cls, url, on):
        ftdi = Ftdi()
        ftdi.open_from_url(url)
        # ... do other things with ftdi

我观察到的是,尽管我试图修补Ftdi(),但对import unittest from unittest import mock from ftdi_interface import FtdiInterface import pyftdi.ftdi class TestFtdiInterface(unittest.TestCase): @mock.patch('pyftdi.ftdi.Ftdi') def testPowerOn(self, MockFtdi): url = 'some_string' ftdi_instance = mock.MagicMock() ftdi_instance.open_from_url = mock.MagicMock() MockFtdi.return_value = ftdi_instance FtdiInterface.set_power(url, True) ftdi_instance.open_from_url.assert_called_with(url) 的调用会调用库代码,而不是我的模拟对象。

我错过了什么?

1 个答案:

答案 0 :(得分:2)

Where to patch州:

  

基本原则是你可以在查找对象的位置进行修补,这不一定与定义对象的位置相同。

这意味着要mock一个类Ftdi,您必须提供一个指向代码中Ftdi实际实例化的地方的路径。

为此,您需要将@mock.patch('pyftdi.ftdi.Ftdi')替换为@mock.patch('ftdi_interface.Ftdi')

import unittest
from unittest import mock
from ftdi_interface import FtdiInterface

class TestFtdiInterface(unittest.TestCase):

    @mock.patch('ftdi_interface.Ftdi')
    def testPowerOn(self, MockFtdi):
        url = 'some_string'
        ftdi_instance = mock.MagicMock()
        ftdi_instance.open_from_url = mock.MagicMock()
        MockFtdi.return_value = ftdi_instance

        FtdiInterface.set_power(url, True)
        ftdi_instance.open_from_url.assert_called_with(url)

import pyftdi.ftdi没有为测试做任何有用的事情,可以删除。