2016-04-14 17 views
5

diyoruz dalga geçmek. Modülüm, Cleanup, boto3'ü ithal ediyor. Temizleme ayrıca bir "temizleyici" sınıfına da sahiptir.nasıl boto3 istemci nesne/I belirli bir boto3 işlevini alay çalışıyorum

self.ec2_client = boto3.client('ec2') 

Ben EC2 istemci yöntemini taklit istiyor: desribe_tags(), piton olduğunu söylüyor: Ben kazanılmış ettik uzak botocore ithal olduğunu

<bound method EC2.describe_tags of <botocore.client.EC2 object at 0x7fd98660add0>> 

init sırasında, temizleyici bir EC2 istemcisi yaratır

mock.patch(Cleaner.botocore.client.EC2.describe_tags) 

ile başarısız:

AttributeError: 'module' object has no attribute 'EC2' 
benim test dosyası ve çalışırken

nasıl bu yöntemi alay ediyorsun?

import boto3 
class cleaner(object): 
    def __init__(self): 
     self.ec2_client = boto3.client('ec2') 

ec2_client nesne desribe_tags() yöntemi vardır biridir: gibi

Temizleme görünüyor. Bu bir botocore.client.EC2 nesnesi, ama asla botocore doğrudan ithal etmem.

+0

temizlik etkinliği modülü içinde. Bunu kullanmak için EC2'yi tam olarak nasıl ithal ediyorsunuz? Görünüşünden 'import boto3' gibi bir şey yapıyorsunuz. Sağ? Öyleyse, yamalarınızın “Cleanup.boto3.EC2” gibi bir şey olması gerektiğinden şüphelenirim. Modülü 'Temizleme 'ismini verdiyseniz. Emin olmak için daha fazla bilgi yardımcı olacaktır. Modülün – idjaw

+0

örnek bir çözüm buldunuz –

+0

@JeffTang eklendi? Benzer bir şey arıyorum! – ptimson

cevap

0

Sen test ettiğiniz yere göre alay edilmelidir. Eğer cleaner sınıf test ediyoruz, yani (Ben önermek burada PEP8 standartlarını kullanmak ve bu Cleaner yapmak), o zaman test ettiğiniz yere göre alay etmek istiyorum. Sana buna bir çözüm bulduk

+0

Ben 'boto3.client' alay çalışmıyorum. "Boto3.client" –

+0

tarafından döndürülen "botocore.client.EC2" nesnesinin bir yöntemi "describe_tags" ile uğraşmaya çalışıyorum, bu yüzden hala EC2'nin çalışan bir istemcisini başlatıyorsunuz, ancak sahte olmak istiyor oluşturduğunuz nesneden bir yöntem mi? Tipik olarak, birim test edildikten ve yama uyguladığınızda, bu EC2 istemcisi gibi dış kaynaklardan çıkmak istiyorsunuz. Test etmek istediğiniz bu yöntemi, "boto_client_mock" ifadesinin return_value yoluyla doğrulayabilirsiniz. – idjaw

+0

@JeffTang * Yapacağınız şeylerin neler olabileceğine dair daha ayrıntılı bir örnek verdim (sadece genel fikir vermek için denenmemiş). – idjaw

1

yapmaya çalıştıkları şeyi yapmaya pek çok örnek vardır mocking documentation aracılığıyla okumanızı öneririz

class SomeTest(Unittest.TestCase): 
    @mock.patch('path.to.Cleaner.boto3.client', return_value=Mock()) 
    def setUp(self, boto_client_mock): 
     self.cleaner_client = boto_client_mock.return_value 

    def your_test(self): 
     # call the method you are looking to test here 

     # simple test to check that the method you are looking to mock was called 
     self.cleaner_client.desribe_tags.assert_called_with() 

: Yani, yama aslında çizgisinde şey olmalıdır trying to mock a different method for the S3 client

import botocore 
from mock import patch 
import boto3 

orig = botocore.client.BaseClient._make_api_call 

def mock_make_api_call(self, operation_name, kwarg): 
    if operation_name == 'DescribeTags': 
     # Your Operation here! 
     print(kwarg) 
    return orig(self, operation_name, kwarg) 

with patch('botocore.client.BaseClient._make_api_call', new=mock_make_api_call): 
    client = boto3.client('ec2') 
    # Calling describe tags will perform your mocked operation e.g. print args 
    e = client.describe_tags() 

Umut zaman yardımcı :)

İlgili konular