在django的测试中连接模拟和客户端

时间:2011-11-14 21:21:14

标签: django testing mocking

我写过两个类:System和Order,它们代表“在线票务分发商店”。

订购很简单:

order = Order('title', set(['1', '2', '5']))
System.fill(order)

但我想测试我的views.fill_order函数,并检查它是否正确填充了POST参数的顺序。要做到这一点,我可以像这样使用mock和client:

from core.order import Order
from core.system import System
from django.test.client import Client
from mock import Mock, sentinel

self.logged_client = Client()
# skipping logging process

Order = Mock(sentinel.return_value)
System = Mock()
System.fill = Mock()

# sending hypotetic POST
self.logged_client.post('/my_view_url/', {'title': self.PHANTOM, 'seat_numbers': '1I', 'seat_numbers': '3IV'})

System.fill.assert_called_with(Order.return_value)
Order.assert_called_with(self.PHANTOM, set(['1I', '2II', '3IV']))

但是......它没有用(断言失败)。如何解决?

我知道这是因为在我的views.fill_order函数中我做了:

from core.system import System
from core.order import Order

再一次,但是如何在测试过程中强制这些类被嘲笑?

2 个答案:

答案 0 :(得分:2)

成功模拟的关键是要记住,您需要替换模块中实际使用的对象,而不是定义测试的对象。因此,在您的情况下,您要导入视图模块并替换那里的类:

from core.whatever import views
views.System = my_mock_system
views.Order = my_mock_order

答案 1 :(得分:1)

在模拟和使用客户端时它不起作用,因为它似乎启动了一个不同的项目实例,没有模拟的类。 我没有成功做到这一点,唯一的方法似乎是实现类本身......