2011-03-15 70 views
2

我试图用unittest测试下面的类和mock库:嘲讽链式调用在Python

class Connection(object): 
    def __init__(self, cookie): 
    self.connect = None 
    self.session = Session() 
    self.session.load(cookie) 
    # do some stuff with self.session 
    self.some_info = self.session.data['the_info'] 

我怎么能测试,如果当我创建的Connection一个实例,这取决于Session返回例如,我断言如果self.some_info与我期待的价值?

我想使用模拟库。在它的文档中,我有一个模仿链接调用的例子(http://www.voidspace.org.uk/python/mock/examples.html#mocking-chained-calls),但是我不太清楚如何使它适应我的问题。

Session.load(cookie)方法在Session实例中设置了一些属性。我想为我的测试设置这个值,以确定每个cookie的值。

+1

你有什么这么远吗? – 2011-03-16 00:33:07

回答

3

假设Connection位于模块package.module.connection

下面的代码应该是你将如何测试您的会话:

import mock 


class TestConnection(unittest.TestCase): 

    @mock.patch('package.module.connection.Session') 
    def test_some_info_on_session_is_set(self, fake_session): 
     fake_session.data = {'the_info': 'blahblah'} 
     cookie = Cookie() 
     connection = Connection(cookie) 
     self.assertEqual(connection.some_info, 'blahblah') 
     fake_session.load.assert_called_once_with(cookie) 
+0

我之前并不了解修补程序修饰符。在你的回答之后,我再次阅读模拟文档,看到更好的方式(或唯一的:-))来完成我所需要的。 – 2011-03-16 21:00:18

+0

很高兴我可以帮助:) – 2011-03-16 21:14:15

+0

不幸的是,如果我正在尝试更改Session类的某些函数的返回值,那么修补程序decorater是可以的。但是,如果我尝试更改数据字典,则测试结果为: TypeError:'Mock'对象不可订阅 – 2011-03-17 02:59:13