【发布时间】:2019-06-03 16:43:59
【问题描述】:
我正在尝试为需要使用我不想使用的外部模块中的类来实例化某些对象的方法创建一些单一测试,因为它们需要我在对象初始化时无法传递的参数。
例如,假设我要测试的代码具有以下结构:
from module_one import Class_1
from module_two import Class_2
class MyMainClass()
def method_to_be_tested(self, stuff):
var_one = Class_1(stuff.data)
self.var_two = Class_2(var_one.data)
print("The var is %s" % self.var_two.attribute)
stuff 是一个复杂的参数,有几个我无法模拟的属性。
这是我在我的测试方法中尝试过的,使用来自unittest.mock 的patch(但它不起作用):
@patch('module_two.Class_2')
@patch('module_one.Class_1')
def test_method(self, mocked_class1, mocked_class2):
stuff = mock()
mocked_class1.return_value = 'some_stuff_that_i_dont_want'
mock_class2 = mock()
mock_class2.attribute = 'what_i_want_to_get'
mocked_class2 = mock_class2
mymainclass.method_to_be_tested(stuff)
assertEqual('what_i_want_to_get', mymainclass.var_two.attribute)
似乎补丁或其他东西不起作用,因为它抛出一个错误,告诉我 str 对象没有属性数据,当 var_one.data 用作 var_one 时Class2 的参数。
我想要将任何参数传递给Class2 并始终获得我在mock_class2 中定义的内容。
编辑: mock() 是从 mockito 模块导入的,但也许我不需要这个来实现我所需要的。
【问题讨论】:
-
我认为你不应该设置
mocked_class1.return_value。无论如何,您想在这里测试什么?你没有做出任何断言。 -
用断言编辑。我想检查
var_two.attribute是what_i_want_to_get。问题不在于mocked_class1,而在于Class2,这似乎需要我没有的论据,即使我使用patch。正如我所说,我想要的是在将任何参数传递给Class2时始终获得相同的值,即使我在method_to_be_tested中使用的参数不存在。我的意思是,我在测试中真正想要的是直接将我想要的值分配给var_two。我不知道这是否可能。 -
什么是
mock?有一个模块unittest.mock但当然它是不可调用的,所以stuff = mock()引发TypeError: 'module' object is not callable或只是NameError: name 'mock' is not defined对我来说。 -
"str 对象没有属性数据,指的是 var_one" 当然,你有 `var_one = Class_1(stuff.data)` 并且你正在修补
Class_1以返回一个字符串,所以 @ 987654348@ 变成一个字符串,它没有data属性。 -
mock是从mockito模块导入的(对不起,我应该指定它)。即使var_one没有预期的属性,有什么方法可以让Class2(var_one.data)返回我想要的吗?