假设我有以下代码:

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

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


如何测试对methodnew_key的模拟调用set_content?我开始以下方式

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

最佳答案

Bruno的答案是一个很好的技巧,但是从您的评论中可以清楚地看到您正在使用旧版代码。

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

现在,您必须修补S3Connection工厂(构造函数),之后,模拟对象的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

10-08 19:17