Mock

2012-04-12 24 views
5

kullanarak bir işlevi düzeltme Bir test paketim var (burnu kullanarak, değil) ve test sınıfındaki her sınama için belirli bir değerler dizisini döndürmek için bir işlevi yamalamak istiyorum. basitleştirilmiş örneği kullanarak benim ilk girişimi, oldu: yan etkiler bittiğinde ikinci testi başarısız böylece Mock

@patch('time.clock', MagicMock(side_effects=[1, 2])) 
class Tests: 
    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

Ancak MagicMock örneği sadece bir kez oluşturulur. Her bir test yöntemini ayrı ayrı kopyalayabilirim, ama ben gerçekten de yama decorator'unu çoğaltmak istemiyorum (bu örnekte olduğundan çok daha fazla test var!) Bunu yapabilmem için başka bir yol da böyle kurulum kodu:

class Tests: 
    def setup(self): 
     self.old_clock = time.clock 
     time.clock = MagicMock(side_effects=[1, 2]) 

    def teardown(self): 
     time.clock = self.old_clock 

    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

Ama tasarruf ve orijinal işlevi tanımı yeniden Mock otomatik yapmak mümkün olmalıdır şey gibi görünüyor. Bunu yapmamın başka bir yöntemi var mı? Yoksa son örneğim bunu yapmanın en iyi yolu nedir?

cevap

2
a = (x for x in [1,2]) 

x = lambda : next(a) 

x() 

Out: 1

x() 

Out: 2

bir listesinin içine cevapları koyun. İstediğiniz ad için X olarak değiştirin.

+0

Burada alıyoruz hiçbir fikrim yok. Soruyu hiç bir şekilde görmüyor gibi görünmüyor ve 'x = [1, 2] .__ iter __().' Yazmanın karmaşık bir yoluna benziyor. Ne demeye çalışıyorsun? – aquavitae

+0

iyi. Bir fonksiyonun alayını yaratmanın bir yolunu istiyorsun. Artık cevapların sırası sende. Yok hayır? x = ["İlk Yanıtınız", "İkinci Yanıtınız", "... vb") .__ iter __() sonraki Sorunu çözer. – Nasgar

+0

Bir yineleyicinin nasıl oluşturulacağını ve bir işlevle nasıl çalıştığını biliyorum. Sorum şu, her test işlevi için sahte cihazı sıfırlamanın kolay bir yolu olup olmadığıydı. – aquavitae

1

Sadece yerine sınıfa işlemini uygulamak, bütün testlerine yama uygulamalıdır:

class Tests: 
    @patch('time.clock', MagicMock(side_effects=[1, 2])) 
    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    @patch('time.clock', MagicMock(side_effects=[1, 2])) 
    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2