Django视图中的依赖注入

2024-10-02 02:37:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我想为我的django项目使用依赖注入。为此,我尝试pinject包。就像在ASP.NET,所有依赖项都在构造函数中给出,这很好,因为它很容易测试。我还想在我的django项目中归档类似的内容。在

我有一个简单的观点:

class MySimpleView(View):
    def __init__(self, dependency1, dependency2, **kwargs):
        super().__init__(**kwargs)
        ...

我定义绑定的地方

^{pr2}$

我希望能像这样使用它。在

# urls.py
urlpatterns = [
    path('path/to/my/view', obj_graph.provide(MySimpleView).as_view()),
]

但不幸的是,django不允许从实例调用.as_view()。在

有没有简单的方法可以将依赖项注入到我的视图中,这样我就可以轻松地进行模拟和测试了?在


Tags: path项目djangoview内容netinitas
1条回答
网友
1楼 · 发布于 2024-10-02 02:37:05

如果您的目标是为您自己提供一种简单而安全的方法来进行'模拟和测试,那么您最好使用unittest提供的{a1}(顺便说一下,这也很像.NET中的mocking)。有了这个,你可以这样做:

from unittest.mock import Mock, patch
from django.tests import TestCase

class MySimpleViewTestCase(TestCase):
    @patch('module_name.dependency2')
    @patch('module_name.dependency1.specific_method_or_attribute')
    def test_something_about_mysimpleview(self, mock_dependency1, mock_dependency2):
        mock_dependency1.return_value = Mock(some_attribute="foo", some_method.return_value="bar")
        mock_dependency2.return_value = 42

        # do your testing of MySimpleView

现在,当测试运行时,mock将用模拟对象替换module_name.dependency1.specific_method_or_attribute和{}。因此,当module_name.dependency2()运行时,它将返回42,而{}将返回一个Mock对象,该对象具有值为"foo"的属性和返回{的方法some_method()。在

您可以使用它来模拟函数、类甚至模块。在

相关问题 更多 >

    热门问题