2013-04-17 50 views
11

Lần đầu tiên sử dụng bản vá. Tôi đã cố gắng vá một trong các lớp của tôi để kiểm tra. Nếu không có bản vá cố gắng chạy vượt qua định nghĩa hàm thử nghiệm, nhưng với bản vá, định nghĩa hàm thử nghiệm dường như yêu cầu một thông số khác và tôi nhận được một sốPatch - Vá lớp giới thiệu một tham số bổ sung?

TypeError: testAddChannelWithNamePutsChannel() takes exactly 1 argument (2 given) 

. Mã thử nghiệm như sau:

import unittest 
import mock 
from notification.models import Channel, addChannelWithName, deleteChannelWithName 

class TestChannel(unittest.TestCase): 
    @mock.patch('notification.models.Channel') 
    def testAddChannelWithNamePutsChannel(self): 
     addChannelWithName('channel1') 
     Channel.put.assert_called_with() 

Tại sao yêu cầu tham số bổ sung với bản vá và tham số này nên là gì? Cảm ơn bạn rất nhiều!

+2

Hãy thử sử dụng 'self, * args' thay vì chỉ' self' và in ra 'args'. –

Trả lời

6

patch chuyển đối tượng được vá đến hàm kiểm tra. Nó ghi here:

vá như chức năng trang trí, tạo ra các mô hình cho bạn và đi qua nó vào chức năng trang trí:

>>> 
>>> @patch('__main__.SomeClass') 
... def function(normal_argument, mock_class): 
...  print(mock_class is SomeClass) 
... 
>>> function(None) 
True 
23

patch đi trong một thể hiện của đối tượng vá để thử nghiệm của bạn phương pháp (hoặc cho mọi phương pháp kiểm tra nếu bạn đang vá ở cấp lớp). Đây là tiện dụng vì nó cho phép bạn thiết lập các giá trị lợi nhuận và tác dụng phụ, hoặc kiểm tra các cuộc gọi được thực

@patch('some_module.sys.stdout') 
def test_something_with_a_patch(self, mock_sys_stdout): 
    mock_sys_stdout.return_value = 'My return value from stdout' 

    my_function_under_test() 

    self.assertTrue(mock_sys_stdout.called) 
    self.assertEqual(output, mock_sys_stdout.return_value) 

Nếu bạn chỉ muốn theo nghĩa đen vá một cái gì đó để bỏ qua nó thì bạn có thể gọi vá với sự thỉnh nguyện sau

@patch('some_module.sys.stdout', Mock()) 
def test_something_with_a_patch(self): 

Điều đó thay thế sys.stdout trong some_module bằng đối tượng giả và không chuyển nó cho phương thức.