python - 在以下情况下如何模拟方法调用?

标签 python mocking

假设我有以下代码:

class A
   def __init__(self)
       self.bucket = S3Connection().get_bucket()

   def method(self)
       key = self.bucket.new_key()
       key.set_contents()   

如何测试对 new_keyset_content 的模拟调用的方法?我开始采用以下方式

    @patch('my_file.S3Connection')
    test_method()
         a = A()

最佳答案

布鲁诺的回答是一个很好的提示,但从您的评论中可以清楚地看出您正在使用旧代码。

我不是 boto 专家,但我想如果您修补整个 S3Connection 而不是仅修补其 get_bucket() 方法,效果会更好。

现在您必须修补 S3Connection factory (构造函数),之后您的模拟的 return_value 将成为我们要求的对象get_bucket().

你的测试变成:

@patch('my_file.S3Connection')
test_method(mock_s3connection)
     mock_bucket = mock_s3connection.return_value.get_bucket
     a = A()
     #Just for fun ... check if the patch works like expected
     assert a.bucket is mock_bucket
     a.method()
     #check method logic
     assert mock_bucket.new_key.set_contents.called

关于python - 在以下情况下如何模拟方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29489932/

相关文章:

c# - NSubstitute - 使成员返回 lambda 调用的结果

java - 是否有任何其他方法可以在构造函数中模拟此方法调用

ruby-on-rails - Rspec 测试比较<=>

python - 如何优化 numpy 调用的数据生成

python - 如何打开文件夹中的每个文件

python - 根据具有重复值的列表重新排序 Pandas 数据框

go - 使用 go-mocket 模拟 GORM 数据库不起作用

python - 从脚本创建和构建 docker Dockerfile

python - 如何在 OpenCV 中找到二进制骨架图像的端点?

c++ - 为什么我的 Hippomock 期望在使用多重继承时失败