为Django View get_context_data()方法编写测试

问题描述 投票:3回答:2

我正在为View编写测试,我在其中更新上下文以将其他信息传递给模板。

Problem

在编写测试时,我无法从RequestFactory访问上下文。

Code

View

class PlanListView(HasBillingRightsMixin, ListView):
    """Show the Plans for user to select."""

    headline = "Select a Plan"
    model = Plan
    template_name = "billing/plan_list.html"

    def get_context_data(self, *args, **kwargs):
        context = super(PlanListView, self).get_context_data(**kwargs)
        context.update({
            "customer": self.get_customer()
        })
        return context

Test

class TestPlanListView(BaseTestBilling):

    def setUp(self):
        super(TestPlanListView, self).setUp()
        request = self.factory.get('billing:plan_list')
        request.user = self.user
        request.company_uuid = self.user.company_uuid

        self.view = PlanListView()
        self.view.request = request
        self.response = PlanListView.as_view()(request)

    def test_get_context_data(self, **kwargs):
        context = super(self.view, self).get_context_data(**kwargs)
        context.update({"customer": self.view.get_customer()})
        self.assertEqual(
            self.view.get_context_data(),
            context
        )

Question

如何测试视图的get_context_data()方法?

django django-views django-testing
2个回答
4
投票

使用test client可以访问您的上下文。

def test_context(self):
    # GET response using the test client.
    response = self.client.get('/list/ofitems/')
    # response.context['your_context']
    self.assertIsNone(response.context['page_obj'])
    self.assertIsNone(response.context['customer']) # or whatever assertion.
    .....

1
投票

如果您不想测试完整的浏览器行为,则可以使用RequestFactory。此工厂提供了一个可以传递给视图的请求实例。在我的情况下的好处是,我可以将单个视图功能测试为黑盒子,具有完全已知的输入,测试特定输出。正如文档中所述。

class TestView(TemplateView):
    template_name = 'base.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context = {'1': 11337}
        return context

# ...
def test_context(self):
    factory = RequestFactory()
    request = factory.get('/customer/details')
    response = TestView.as_view()(request)
    self.assertIsInstance(response.context_data, dict)
    self.assertEqual(response.context_data['1'], 1337)
© www.soinside.com 2019 - 2024. All rights reserved.