在Django模板中模拟方法调用
我创建了一个名为 Product 的模型,并为它写了一个方法 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 }}
我希望在输出中看到的内容:
sldkfsdf
在模板中:
sldkfsdf
我实际得到的输出:
sldkfsdf
在模板中:
<value, returned by original Product.in_stock() method>
所以在我的视图中调用 Product.in_stock() 是正常的,但在模板中却不行。 :( 我哪里做错了?我需要怎样在模板渲染中模拟这个方法?
而且我用的是非常老的 Django - 1.1.1 :(
Python 2.7
Mock 1.0.1
1 个回答
1
这和模拟对象是 MagicMock
的实例有关,而不是简单的 Mock
。
我想这可能是因为 Django 在模板中以不同的方式访问方法和属性:比如 {{ obj.foo }}
可能既是对象的一个方法,也可能是一个属性,这就导致了像 __getitem__()
这样的魔法方法被使用。
你可以使用 patch(new=Mock, …)
来创建一个 Mock
实例,而不是 MagicMock
。