2013-11-28 11 views
14

Tôi cố gắng kiểm tra một số mã không trả lại bất kỳ thứ gì nhưng lưu kết quả vào DB. Bằng cách chế nhạo phương thức lưu, tôi muốn kiểm tra xem mọi thứ đã được xử lý đúng chưa:Làm thế nào để gọi tự trong một phương pháp giả của một đối tượng bằng Python?

def mock_save(self): 
    assert(self.attr, 'dest_val') 
with mock.patch.object(Item, "save", create=True) as save: 
    save.side_effect = mock_save 
    func_to_call() //in func_to_call, I call item.save() 

Tuy nhiên, có vẻ như điều này không được phép. Nó nói rằng số lượng đối số không khớp.

Nếu tôi làm def mock_save(), nó sẽ không hoạt động.

Làm cách nào để tôi có thể tham chiếu đến đối tượng mà phương thức giả tạo hoạt động? (Tôi thấy nó trong một chủ đề đó là áp dụng đối với init phương pháp mà có thể được gọi trực tiếp từ lớp)

Trả lời

14

Bạn cần autospec=True

def mock_save(self): 
    assert self.attr == 'dest_val' 
with mock.patch.object(Item, "save", autospec=True) as save: 
    save.side_effect = mock_save 
    func_to_call() 
0

Đôi khi bạn chỉ muốn kiểm tra xem một phương pháp đã được gọi là , nhưng bạn không thể kiểm soát nơi lớp của nó được khởi tạo hoặc phương thức được gọi. Đây là một cách tiếp cận có thể tiết kiệm thời gian cho bất kỳ ai vấp ngã trên mẫu này:

# first get a reference to the original unbound method we want to mock 
original_save = Item.save 
# then create a wrapper whose main purpose is to record a reference to `self` 
# when it will be passed, then delegates the actual work to the unbound method 
def side_fx(self, *a, **kw): 
    side_fx.self = self 
    return original_save(self, *a, **kw) 
# you're now ready to play 
with patch.object(Item, 'save', autospec=True, side_effect=side_fx) as mock_save: 
    data = "the data" 
    # your "system under test" 
    instance = SomeClass() 
    # the method where your mock is used 
    instance.some_method(data) 

    # you now want to check if it was indeed called with all the proper arguments 
    mock_save.assert_called_once_with(side_fx.self, data) 
Các vấn đề liên quan