是否可以在测试中检查调用参数?
Is it possible to check the call parameters in the test?
如果我们调用主方法 运行 调用我感兴趣的方法 - self.get_request().
file.py
class A:
def run():
some logic...
request = self.get_request()
some logic...
return response
test.py
from file.py import A
def test():
"""
Inside this test, I want to check the parameters and the value returned by the
get_request method, but I don't want to check it separately
I want to check it by calling the parent method - run
"""
instance = A()
response = instance.run()
assertions logic for instance.get_request..
我知道可以模拟一个方法,然后我们可以访问调用次数、参数等。如果我的要求可以通过模拟以某种方式实现,我只想补充一点我的模拟必须与它模拟的方法具有相同的逻辑(相同)。
你问的可能是wraps
参数可以用在patch - this allows you to mock a function, while it still retains the previous (or some other) functionality (note that the argument itself is described under Mock)。与任何模拟一样,这确实允许您测试调用和调用 args,但是 not 允许您检查函数的 return 值。这必须通过其副作用进行测试(在您的情况下,通过 returned response
应该取决于 get_request
的 return 值)。
这是您案例的示例:
from unittest import mock
class A:
def run(self):
request = self.get_request(21)
return request
def get_request(self, foo):
return foo * 2
def test_run():
instance = A()
with mock.patch.object(instance, "get_request", wraps=instance.get_request) as mocked:
assert instance.run() == 42
mocked.assert_called_once_with(21)
在这种情况下,模拟调用真正的 get_request
方法并 return 其结果,同时记录调用和调用参数。
我在 get_request
中添加了一些参数用于演示,并且 return 直接在 run
中编辑了调用的结果 - 在您的情况下这当然会有所不同,但想法应该是相同的。
如果我们调用主方法 运行 调用我感兴趣的方法 - self.get_request().
file.py
class A:
def run():
some logic...
request = self.get_request()
some logic...
return response
test.py
from file.py import A
def test():
"""
Inside this test, I want to check the parameters and the value returned by the
get_request method, but I don't want to check it separately
I want to check it by calling the parent method - run
"""
instance = A()
response = instance.run()
assertions logic for instance.get_request..
我知道可以模拟一个方法,然后我们可以访问调用次数、参数等。如果我的要求可以通过模拟以某种方式实现,我只想补充一点我的模拟必须与它模拟的方法具有相同的逻辑(相同)。
你问的可能是wraps
参数可以用在patch - this allows you to mock a function, while it still retains the previous (or some other) functionality (note that the argument itself is described under Mock)。与任何模拟一样,这确实允许您测试调用和调用 args,但是 not 允许您检查函数的 return 值。这必须通过其副作用进行测试(在您的情况下,通过 returned response
应该取决于 get_request
的 return 值)。
这是您案例的示例:
from unittest import mock
class A:
def run(self):
request = self.get_request(21)
return request
def get_request(self, foo):
return foo * 2
def test_run():
instance = A()
with mock.patch.object(instance, "get_request", wraps=instance.get_request) as mocked:
assert instance.run() == 42
mocked.assert_called_once_with(21)
在这种情况下,模拟调用真正的 get_request
方法并 return 其结果,同时记录调用和调用参数。
我在 get_request
中添加了一些参数用于演示,并且 return 直接在 run
中编辑了调用的结果 - 在您的情况下这当然会有所不同,但想法应该是相同的。