[英]how to mock dependency in python
我是python单元测试框架的新手,并且在模拟依赖中有很多困惑。
我正在尝试为类的下面的成员函数编写单元测试,( check_something()
):
class Validations:
def check_something(self):
abc = os.environ['PLATFORM']
xyz = Node()
no_of_nodes = len(xyz.some_type_var)
if abc != "X_PLATFORM" or no_of_nodes != 1:
raise someException()
我们如何消除依赖?
Node()
? abc
被赋予X_PLATFORM
? 如何为变量no_of_nodes
赋值1
? 而这又是从Node()
对象派生的。
class Node(object): def __init__(self): self.nodes = DEF() self.some_type_var = someclass().getType() self.localnode = os.environ['HOSTNAME'] self.peertype = self.get_peer_type() def get_peer_type(self): return node
我试着写下单元测试。 我无法检查失败和通过条件。 我不确定它是否正确。
class TestValidation(unittest.TestCase):
@mock.patch.object(Node, "get_peer_type")
@mock.patch('somefile.Node', spec=True)
def test_1(self, mock_object1, mock_object2):
os.environ['PLATFORM'] = 'X_PLATFORM'
obj = Validations()
self.assertRaises(someException, obj.check_something)
验证类使用Node()
类对象,而Node类使用其他类。
是的,你要模拟被测代码单元外部的任何东西。 这意味着os.environ
字典和Node()
类。
补丁需要应用于您的代码所在的模块; 如果somefile
与Validations
是同一个模块,那么@mock.patch('somefile.Node', spec=True)
是正确的。 请参阅“ 补丁的位置”部分 ,了解其原因。
我不确定使用spec=True
在这里是否有用; 您的Node
属性是在Node.__init__
创建的所有实例属性,因此它们在类上不可用,这是通知规范的。 如果您确实想要设置规范,请参阅有关如何克服该问题的自动指定部分。
abc
是从os.environ
设置的,你可以使用patch.dict()
对象根据需要修补该字典。
xyz = len(xyz.some_type_var)
只需通过将some_type_var
属性设置为具有正确长度的对象, 或者通过设置xyz.some_type_var.__len__.return_value
,因为它是xyz.some_type_var.__len__()
方法调用len()
函数。
所以,要测试,你会做:
class TestValidation(unittest.TestCase):
@mock.patch('somefile.Node')
def test_1(self, mock_node):
# set up the Node() instance, with the correct length
node_instance = mock_node.return_value
node_instance.some_type_var.__len__ = 2
# or, alternatively, node_instance.some_type_var = (1, 2)
# set up os.environ['PLATFORM']
with mock.patch.dict('os.environ', PLATFORM='X_PLATFORM'):
obj = Validations()
with self.assertRaises(someException):
obj.check_something()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.