django模板中的模拟方法调用

时间:2014-05-29 07:15:22

标签: python django templates mocking

我创建了产品模型的方法 in_stock()。我需要在视图和模板渲染中模拟它。

我的测试:

def test_my_view(self):
    with patch.object(models.Product, 'in_stock', return_value='sldkfsdf'):
    # OR with patch.object(views.Product, 'in_stock', return_value='sldkfsdf'):

        response = self.client.get(reverse('my_view'))
    print response.content

我的观点:

def my_view(request):
    product = Product.objects.get(pk=1)
    print product.in_stock()
    context = RequestContext(request, {
        'product': product,
    })

    return render_to_response('product/my_view.xml', context)

我的模板:

{{ product.in_stock }}
在stdout中

我需要什么

sldkfsdf

并在模板中:

sldkfsdf

我在stdout中得到了什么

sldkfsdf
模板中的

<value, returned by original Product.in_stock() method>

因此my_view中的Product.in_stock()调用效果很好。它不仅适用于模板。 :(我做错了什么?我需要在模板渲染中模拟方法?

我有很老的Django - 1.1.1 :(

Python 2.7

模拟1.0.1

1 个答案:

答案 0 :(得分:0)

这与模拟对象是MagicMock而不是Mock的实例有关。

我猜这是由于Django在模板中以不同的方式访问方法/属性:{{ obj.foo }}可能既是对象的方法又是属性,并导致了__getitem__()之类的魔术方法正在使用。

您可以使用patch(new=Mock, …)来创建Mock实例,而不是MagicMock