我创建了产品模型的方法 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
答案 0 :(得分:0)
这与模拟对象是MagicMock
而不是Mock
的实例有关。
我猜这是由于Django在模板中以不同的方式访问方法/属性:{{ obj.foo }}
可能既是对象的方法又是属性,并导致了__getitem__()
之类的魔术方法正在使用。
您可以使用patch(new=Mock, …)
来创建Mock
实例,而不是MagicMock
。