Django:我怎样才能模拟request.session of view?

时间:2016-10-25 23:07:27

标签: python django mocking django-testing

我正在使用模拟来测试视图。

tests.py

@patch('orders.views.OrderView.generate_merchant_uid')
def test_expected_price_is_registered_on_GET_request(self, mock_generate_merchant_uid):
    self.client.get(reverse('orders:order'))

views.py

class OrderView(LoginRequiredMixin, View):

    def generate_merchant_uid(self):
        merchant_uid = "blah_blah_blah"
        return merchant_uid

    def get(self, request, *args, **kwargs):
        merchant_uid = self.generate_merchant_uid()
        request.session['merchant_uid'] = merchant_uid
        return HttpResponse('a')

出现错误:

TypeError: <MagicMock name='generate_merchant_uid()' id='4431843456'> is not JSON serializable

出现错误,因为我嘲笑generate_merchant_uid并返回MagicMockView,试图将此MagicMock存储在request.session中。

我认为我要做的就是模仿request.session

但不知道我怎么能这样做。

需要建议。感谢。

1 个答案:

答案 0 :(得分:1)

问题不在于嘲笑会话本身。你忘了设置你的模拟函数应该返回的内容。默认情况下,它返回一个Mock对象,它试图存储它请求会话并将其转换为JSON,在那里你得到了错误,Mock实例不是JSON可序列化的。

@patch('orders.views.OrderView.generate_merchant_uid')
def test_expected_price_is_registered_on_GET_request(self, mock_generate_merchant_uid):

    mock_generate_merchant_uid.return_value = //here goes your mocked value

    self.client.get(reverse('orders:order'))

例如:

mock_generate_merchant_uid.return_value = "blah_blah_blah"