检查调用一次的 Mocked 方法的实例
Check the instance of a Mocked method called once
我的函数在数据库中查找 Actor
对象并使用传递的参数调用其 do_something()
方法。
from my_app.models import Actor
def my_function(id, stuff):
actor = Actor.objects.get(id=id)
return actor.do_something(stuff)
我希望我的单元测试检查两件事:
1.my_function
找到我想要的Actor
2. my_function
按预期调用演员的 do_something
方法。
from unittest import mock
from django.test import TestCase
from my_app.models import Actor
from my_app.views import my_function
class ViewsTestCase(TestCase):
@classmethod
def setUpTestData(cls):
self.actor = Actor.objects.create(id=42, name='John')
def test_my_function(self):
with mock.patch.object(Actor, 'do_something') as mock_do:
my_function(id=42, stuff='a-short-string')
mock_do.assert_called_once_with('a-short-string')
这可以确保 my_function
像我想要的那样调用 do_something
但我不知道如何确定它找到了我让他找到的 Actor。即使 my_function
找到了错误的演员,这个测试也会通过。有什么办法可以检查吗?
首先,我不确定这是否是对模拟方法的 self
参数进行断言的最佳实践。
通过将 autospec=True
添加到您的模拟语句中,self
参数本身将可以在模拟对象 call_args
中访问。更清楚地说,您的测试用例将是这样的:
from unittest import mock
from django.test import TestCase
from my_app.models import Actor
from my_app.views import my_function
class ViewsTestCase(TestCase):
@classmethod
def setUpTestData(cls):
self.actor = Actor.objects.create(id=42, name='John')
def test_my_function(self):
with mock.patch.object(Actor, 'do_something', autospec=True) as mock_do:
^^^^^^^^^^^^^
my_function(id=42, stuff='a-short-string')
mock_do.assert_called_once_with(self.actor, 'a-short-string')
我的函数在数据库中查找 Actor
对象并使用传递的参数调用其 do_something()
方法。
from my_app.models import Actor
def my_function(id, stuff):
actor = Actor.objects.get(id=id)
return actor.do_something(stuff)
我希望我的单元测试检查两件事:
1.my_function
找到我想要的Actor
2. my_function
按预期调用演员的 do_something
方法。
from unittest import mock
from django.test import TestCase
from my_app.models import Actor
from my_app.views import my_function
class ViewsTestCase(TestCase):
@classmethod
def setUpTestData(cls):
self.actor = Actor.objects.create(id=42, name='John')
def test_my_function(self):
with mock.patch.object(Actor, 'do_something') as mock_do:
my_function(id=42, stuff='a-short-string')
mock_do.assert_called_once_with('a-short-string')
这可以确保 my_function
像我想要的那样调用 do_something
但我不知道如何确定它找到了我让他找到的 Actor。即使 my_function
找到了错误的演员,这个测试也会通过。有什么办法可以检查吗?
首先,我不确定这是否是对模拟方法的 self
参数进行断言的最佳实践。
通过将 autospec=True
添加到您的模拟语句中,self
参数本身将可以在模拟对象 call_args
中访问。更清楚地说,您的测试用例将是这样的:
from unittest import mock
from django.test import TestCase
from my_app.models import Actor
from my_app.views import my_function
class ViewsTestCase(TestCase):
@classmethod
def setUpTestData(cls):
self.actor = Actor.objects.create(id=42, name='John')
def test_my_function(self):
with mock.patch.object(Actor, 'do_something', autospec=True) as mock_do:
^^^^^^^^^^^^^
my_function(id=42, stuff='a-short-string')
mock_do.assert_called_once_with(self.actor, 'a-short-string')