2013-08-06 27 views
5

Tôi đang sử dụng Mock để thay thế phương thức từ một lớp với một giá trị trả về cụ thể. Nó hoạt động rất tốt, có thể một chút quá tốt ... Tôi làm điều này (xem bên dưới), nhưng trong lớp kiểm tra tiếp theo, tôi sử dụng lại lớp mật khẩu mà không chế nhạo, và mô hình được đặt trong thử nghiệm đó vẫn hiệu quả.Python undo method mock

from utils import password as pass_helper 

class TestPassword(unittest.TestCase): 
    def setUp(self): 
     self.username = "user" 
     self.password = "Test_1234_pass" 
     pass_helper._get_password_from_keyboard = Mock(return_value=self.password) 

    def test_password(self): 
     password = pass_helper._get_password_from_keyboard(self.username) 
     self.assertEqual(password, self.password) 

Tôi đã cố gắng hoàn tác mô hình bằng phương pháp TearDown bằng cách thực hiện một việc như thế này nhưng không hoạt động.

pass_helper._get_password_from_keyboard = pass_helper._get_password_from_keyboard 

Làm cách nào để khôi phục chức năng gốc của phương pháp lớp học?

Trả lời

3

Vấn đề, có vẻ như bạn đã thu thập, là những thay đổi bạn thực hiện không bị giới hạn trong phạm vi kiểm tra, nhưng thay vào đó lại bị tràn vào các thử nghiệm khác (tất nhiên là một vấn đề lớn khi kiểm thử đơn vị) . Ý tưởng của bạn là làm ngược lại sự thay đổi trong phương pháp teardown của bạn là một trong những tốt, tuy nhiên vấn đề là bạn đang tái gán phiên bản giả của phương pháp này lại cho chính nó khi bạn làm điều này:

pass_helper._get_password_from_keyboard = pass_helper._get_password_from_keyboard 

Something như thế này nên công việc, nơi trước khi chế nhạo phương thức bạn chỉ định phiên bản 'thực tế' của phương thức thành biến tạm thời:

def setUp(self): 
    self.username = "user" 
    self.password = "Test_1234_pass" 
    self.real_get_password_from_keyboard = pass_helper._get_password_from_keyboard 
    pass_helper._get_password_from_keyboard = Mock(return_value=self.password) 

def tearDown(self): 
    pass_helper._get_password_from_keyboard = self.real_get_password_from_keyboard 

def test_password(self): 
    password = pass_helper._get_password_from_keyboard(self.username) 
    self.assertEqual(password, self.password) 

Hy vọng điều này sẽ hữu ích!

+0

Dường như đang khắc phục sự cố của tôi, cảm ơn! :) – Amaranth

+0

sau khi tôi làm điều này, tôi nhận được 'unbound method xxx phải được gọi với xxx instance làm đối số đầu tiên (có int thay vì)' –