检查调用一次的 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')