在Django模板中模拟方法调用

3 投票
1 回答
1219 浏览
提问于 2025-04-18 07:55

我创建了一个名为 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

撰写回答