将模拟side_effect分配给boto异常并断言调用

时间:2016-12-08 09:00:21

标签: python unit-testing mocking pytest monkeypatching

我有一个使用boto从s3下载文件的类,该方法使用 S3Connection 类来启动连接,然后使用 get_key 方法获取文件'。 这是代码块

import sys

from boto.exception import S3ResponseError, S3DataError
from boto.s3.connection import S3Connection

class MyClass(object):
    def __init__(self):
        self.s3conn = S3Connection(
                AWS_ACCESS_KEY_ID,
                AWS_SECRET_ACCESS_KEY,
                host=HOST,
                is_secure=True
        )
        self.bucket = self.s3conn.get_bucket(BUCKET_NAME)
    def get_file(self, key):
        try:
            return self.bucket.get_key(key)
        except (S3ResponseError, S3DataError):
            sys.exit(3)

我想模拟get_bucket方法并给它一个side_effect S3ResponseError ,这样我就可以模拟 sys.exit 方法并断言它被调用

以下是我的表现。

import unittest
import mock
from boto.exception import S3ResponseError, S3DataError
from mymodule import MyClass

class TestS3(unittest.TestCase):
    def setUp(self):
        self.key = 'sample/bubket/key.txt'
        self.myclass = MyClass()

    def test_my_method(self):
        exit_method = (
            'mymodule.'
            'sys.'
            'exit'
        )
        s3_get_bucket = (
            'mymodule.'
            'S3Connection.'
            'get_bucket'
        )


        with mock.patch(s3_get_bucket) as mocked_bucket, \
            mock.patch(exit_method) as mocked_exit:
                mocked_bucket.side_effect = S3ResponseError
                self.myclass.get_file(self.key)
                mocked_exit.assert_called_once_with(3)

然而,断言失败,任何帮助或指导都表示赞赏。

AssertionError: Expected to be called once. Called 0 times.

1 个答案:

答案 0 :(得分:0)

在我看来问题是MyClass.get_file()没有调用get_bucket()。这就是为什么你没有看到sys.exit()的电话。模仿get_key()或致电get_bucket()