python - 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()
从实例中调用 。
有什么简单的方法可以将依赖项注入到我的视图中,以便我可以轻松地模拟和测试?
解决方案
如果您的目标是为自己提供一种简单且安全的“模拟和测试”方式,那么您可能最好使用由提供的模拟库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_attribute
module_name.dependency2
module_name.dependency2()
42
specific_method()
Mock
"foo"
some_method()
"bar"
您可以使用它来模拟函数、类甚至模块。
推荐阅读
- linux - /proc 中是否有任何文件读取它们有副作用?
- javascript - 如何在Ruby和rails中以相同的ID循环调用JS函数
- python - 操作数不能一起广播
- maven - Maven 不可解决的父 POM 问题
- amazon-web-services - AWS S3,无法添加存储桶策略,出现“拒绝访问”错误
- python - 如何选择 JSON 对象并将其分配给烧瓶中的 html 下拉列表?
- c++ - 如何全局声明一个可变长度的 std::array 并在它有 std::string 作为成员时获取它的大小
- symfony - 为什么 Travis-CI 和 composer 在 clear:cache (Symfony) 期间执行查询
- javascript - 如何在jsPDF中设置线宽?
- java - JavaFX observableList 作为 Map 中的值