Tôi đã cố gắng thực hiện một số kiểm tra đơn vị cho một mô-đun. Một module ví dụ đặt tên alphabet.py là như sau:Mocking một biến toàn cầu
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
Tôi muốn thử phản ứng từ một cơ sở dữ liệu với một số giá trị của sự lựa chọn của tôi, nhưng mã dưới đây dường như không làm việc.
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'))
Tôi đã thấy nhiều ví dụ trong đó 'vá' được áp dụng cho các phương pháp và lớp học, nhưng không áp dụng cho các biến. Tôi không muốn vá phương thức database.get vì tôi có thể sử dụng lại nó với các thông số khác nhau sau này, vì vậy tôi sẽ cần một phản hồi khác.
Tôi đang làm gì sai ở đây?
Một hậu quả không may của phương pháp này là bất kỳ thử nghiệm nào khác sử dụng biến cấp mô-đun này sẽ thất bại trừ khi bạn lưu trữ giá trị cũ và đặt lại. Mocking sẽ chăm sóc điều này cho bạn. –
Bạn có thể đặt giá trị của 'alphabet.letters' trở lại thành giá trị trong hàm' tearDown'. – tomas
Ngoài ra, vì 'setUp' được đưa vào toàn bộ lớp thử nghiệm, bạn chỉ có thể sử dụng một giá trị này cho' chữ cái'. Câu trả lời của Will dưới đây cho phép bạn thực hiện nhiều mocks cho các trường hợp thử nghiệm khác nhau, và chúng tự làm sạch chính mình vào cuối để không có nguy cơ ô nhiễm kiểm tra ngẫu nhiên. – raindrift