2013-10-30 24 views
6

Python'da http isteklerini yerine getiren özel bir API'yi test ediyorum, ancak her çalıştığımda gerçek harici sisteme istekte bulunmak istemiyorum birim testleri. API yanıtını dinamik olarak uyandırmak için bir side_effect işlevi ile python'un sahte kitaplığını kullanıyorum. Side_effect yöntemini bir sınıf yöntemi gibi davranmasını nasıl sağlayabilirim? python Mock side_effect birim testinde Class metodu olarak nasıl davranılır

import unittest, mock 

def side_effect_func(self, params): 
    if params['name'] == 'Specific Name': 
     return {'text': 'Specific Action'} 
    else: 
     return {'text': 'General Action'} 

class MyApiTest(unittest.TestCase): 
    def setUp(self): 
     super(MyApiTest, self).setUp() 
     mocked_method = mock.Mock(side_effect=side_effect_func) 
     MyApiClass.make_request = mocked_method 

    def test_create_object(self): 
     api = MyApiClass() 
     params = {'name': 'Specific Name'} 
     r = api.create_an_object(params) # Complains that two arguments are needed! 
     self.assertEqual(r['text'], 'Specific Action') 


import requests 

class MyApiClass(): 
    def make_request(self, params): 
     return requests.get('http://someurl.com', params=params) 

    def create_an_object(self, params): 
     return self.make_request(params) 
bu hatayı

TypeError: side_effect_func() takes exactly 2 arguments (1 given) 

olsun ama ilk argüman olarak api geçmek side_effect_func istiyorum. Herhangi bir yardım için teşekkür ederiz!

cevap

4

En basit yol muhtemelen sahte yönteminizin tek bir argümanı almasını sağlamaktır, daha sonra sahte yöntemin kendisinde statik olarak MyApiClass referansını kullanın. Aksi takdirde, sınıf nesnesinin kendisiyle alay etmeyi deneyebilirsiniz (temelde sahte bir metaclass yapmak) ya da belki de bir mock class yöntemi oluşturmak için partial kullanan bir fabrika kullanın. Ancak tek argüman/statik referans yöntemi sizin için işe yarayacaksa, bu benim için en iyi gözüküyor.

Ayrıca, Mock belgelerinden mocking an unbound method using patch var, daha fazla ihtiyacınız olabileceğine benziyor.

+1

Evet, teşekkürler! Yama ile ilişkisiz bir yöntemin alay edilmesi ihtiyacım olan şey. Aksi takdirde, MyApiClass kodlama öneriniz çalışmalıdır. – conman

İlgili konular