我试图在python代码中模拟对s3的一些调用,但在unittest运行时遇到了某种错误。下面是我调用boto模块到达S3的代码。我试图在这段代码中模拟所有对S3的调用。在
from boto.s3.connection import S3Connection
s3_conn = S3Connection()
bucket_obj = s3_conn.get_bucket(bucket)
key = bucket_obj.lookup(path)
return int(key.size)
在我的单元测试代码中,我有:
^{pr2}$但是,我在运行unittest时遇到了这个错误:
Traceback (most recent call last):
File "/home/vagrant/code/my-project/tests/test_loadfirmware.py", line 92, in test_check_size
self.assertEquals(fake.check_size(),
File "/home/vagrant/code/my-project/test_s3.py", line 80, in check_size
bucket_obj = s3_conn.get_bucket(bucket)
File "/home/vagrant/code/my-project/venv/local/lib/python2.7/site-packages/boto/s3/connection.py", line 506, in get_bucket
return self.head_bucket(bucket_name, headers=headers)
File "/home/vagrant/code/my-project/venv/local/lib/python2.7/site-packages/boto/s3/connection.py", line 525, in head_bucket
response = self.make_request('HEAD', bucket_name, headers=headers)
File "/home/vagrant/code/my-project/venv/local/lib/python2.7/site-packages/boto/s3/connection.py", line 664, in make_request
return super(S3Connection, self).make_request(
TypeError: must be type, not Mock
你知道我在这里遗漏了什么吗?我会假设嘲弄会像我在我的代码中那样直接?在
问题是你在你的测试用例中调用真正的boto,而不是你的mock。在
您需要使用与测试模块中相同的符号名来模拟对象。您不需要尝试修补'boto.s3.connection.S3Connection',而应该修补'test峎s3.S3Connection'。它以“test_s3”开头,因为这是加载被测代码的模块的名称。然后,在点之后,使用与模块内部允许您访问S3Connection的符号相同的符号(也就是说,没有boto.s3.connection)。在
另外,patch会自动为您创建一个mock,因此您不需要创建第一个mock对象。因为您已经修补了S3Connection,而不是修补它内部的东西,您只需要插入您创建的mock作为正确方法的返回值:
相关问题 更多 >
编程相关推荐