python:模拟s3调用的问题

2024-06-08 07:50:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在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

你知道我在这里遗漏了什么吗?我会假设嘲弄会像我在我的代码中那样直接?在


Tags: 代码inpyprojecthomesizes3bucket
1条回答
网友
1楼 · 发布于 2024-06-08 07:50:38

问题是你在你的测试用例中调用真正的boto,而不是你的mock。在

您需要使用与测试模块中相同的符号名来模拟对象。您不需要尝试修补'boto.s3.connection.S3Connection',而应该修补'test峎s3.S3Connection'。它以“test_s3”开头,因为这是加载被测代码的模块的名称。然后,在点之后,使用与模块内部允许您访问S3Connection的符号相同的符号(也就是说,没有boto.s3.connection)。在

另外,patch会自动为您创建一个mock,因此您不需要创建第一个mock对象。因为您已经修补了S3Connection,而不是修补它内部的东西,您只需要插入您创建的mock作为正确方法的返回值:

    mock_bucket = mock.Mock()
    mock_key = mock.Mock()

    with mock.patch('test_s3.S3Connection') as mock_conn:
        mock_conn.get_bucket.return_value = mock_bucket
        mock_bucket.lookup.return_value = mock_key

        mock_key.size.return_value = 50000
        self.assertEquals(fake.check_size(), 50)

相关问题 更多 >