首页 > 解决方案 > django 视图中的依赖注入

问题描述

我想为我的 django 项目使用依赖注入。为此,我正在尝试pinject包。就像在 ASP.NET 中一样,所有依赖项都在构造函数中给出,这非常好,因为它很容易测试。我也想在我的 django 项目中存档类似的东西。

我有一个简单的视图:

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

我定义绑定的地方

# di.py
class AppBindingSpec(pinject.BindingSpec):
    def configure(self, bind):
        # do the bindings here


obj_graph = pinject.new_object_graph(binding_specs=[AppBindingSpec()])

我希望像这样使用它。

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

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

有什么简单的方法可以将依赖项注入到我的视图中,以便我可以轻松地模拟和测试?

标签: pythondjangodependency-injection

解决方案


如果您的目标是为自己提供一种简单且安全的“模拟和测试”方式,那么您可能最好使用由提供的模拟库unittest(顺便说一下,它也很像 .NET 中的模拟)。有了这个,你可以做这样的事情:

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_attributemodule_name.dependency2module_name.dependency2()42specific_method()Mock"foo"some_method()"bar"

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


推荐阅读