Bir modül için bazı birim testleri uygulamaya çalışıyorum. aşağıdaki gibi alphabet.py adında bir örnek modüldür:Genel değişkene geçiş
import database
def length_letters():
return len(letters)
def contains_letter(letter):
return True if letter in letters else False
letters = database.get('letters') # returns a list of letters
ben seçimimi bazı değerlere sahip bir veritabanından yanıtı alay etmek isteriz, ancak aşağıdaki kod çalışmak için görünmüyor.
import unittests
import alphabet
from unittest.mock import patch
class TestAlphabet(unittest.TestCase):
@patch('alphabet.letters')
def setUp(self, mock_letters):
mock_letters.return_value = ['a', 'b', 'c']
def test_length_letters(self):
self.assertEqual(3, alphabet.length_letters())
def test_contains_letter(self):
self.assertTrue(alphabet.contains_letter('a'))
'Yama' uygulamasının yöntemlere ve sınıflara uygulandığı, ancak değişkenlere uygulanmadığı birçok örnek gördüm. database.get yöntemini yamamaya tercih ediyorum çünkü daha sonra farklı parametrelerle tekrar kullanabilirim, bu yüzden farklı bir yanıta ihtiyacım var.
Burada yanlış olan ne yapıyorum?
Bu yaklaşımın talihsiz bir sonucu, eski değeri depoladığınız ve geri yüklemediğiniz sürece, bu modül düzeyi değişkenini kullanan başka bir testin başarısız olacağıdır. Alay etmek senin için halleder. –
"alphabet.letters" öğesinin değerini, 'tearDown' işlevinde bulunduğuna geri döndürebilirsiniz. – tomas
Ayrıca, 'setUp' tüm test sınıfına dağıtıldığı için, bu değerleri sadece 'letters' için kullanabilirsiniz. Will'in cevabı, farklı test senaryoları için birden fazla alay yapmanıza izin veriyor ve sonunda kendilerini temizliyorlar, bu yüzden tesadüfi test kirliliği riski yoktur. – raindrift