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)
的调用会调用库代码,而不是我的模拟对象。
我错过了什么?
答案 0 :(得分:2)
基本原则是你可以在查找对象的位置进行修补,这不一定与定义对象的位置相同。
这意味着要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
没有为测试做任何有用的事情,可以删除。