【问题标题】:mocking method call in django templatedjango模板中的模拟方法调用
【发布时间】:2014-05-29 07:15:21
【问题描述】:

我创建了 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>

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

我有非常老的 Django - 1.1.1 :(

Python 2.7

模拟 1.0.1

【问题讨论】:

  • 原谅我,你试过重新加载服务器吗?
  • @XORcist 我每次都运行测试。服务器已关闭。
  • 我一头雾水:测试客户端不是在访问url吗?
  • @XORcist 您可能想阅读有关测试客户端如何工作的 FineManual。
  • @ambush 为什么要模拟 Product.in_stock() ?您可以根据Product 实例的.in_stock() 结果测试response.content。

标签: python django templates mocking


【解决方案1】:

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

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

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

【讨论】:

  • 这个答案有一个例子会好很多。
猜你喜欢
  • 2014-04-06
  • 2021-02-28
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-27
  • 2013-11-19
  • 1970-01-01
相关资源
最近更新 更多