为了账号安全,请及时绑定邮箱和手机立即绑定

django 视图中的依赖注入

django 视图中的依赖注入

慕田峪9158850 2022-04-27 13:36:02
我想为我的 django 项目使用依赖注入。为此,我正在尝试pinject包。就像在 ASP.NET 中一样,所有依赖项都在构造函数中给出,这非常好,因为它很容易测试。我也想在我的 django 项目中存档类似的东西。我有一个简单的视图:class MySimpleView(View):    def __init__(self, dependency1, dependency2, **kwargs):        super().__init__(**kwargs)        ...我定义绑定的地方# di.pyclass AppBindingSpec(pinject.BindingSpec):    def configure(self, bind):        # do the bindings hereobj_graph = pinject.new_object_graph(binding_specs=[AppBindingSpec()])我希望像这样使用它。# urls.pyurlpatterns = [    path('path/to/my/view', obj_graph.provide(MySimpleView).as_view()),]但不幸的是,django 不允许.as_view()从实例中调用 。有什么简单的方法可以将依赖项注入到我的视图中,以便我可以轻松地模拟和测试?
查看完整描述

1 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

如果您的目标是为自己提供一种简单且安全的“模拟和测试”方式,那么您可能最好使用由提供的模拟库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"


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


查看完整回答
反对 回复 2022-04-27
  • 1 回答
  • 0 关注
  • 185 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信