2016-02-23 15 views
5

không nhất thiết Tôi cố gắng vá một lớp được khởi tạo bởi lớp mà tôi đang cố gắng kiểm tra, nhưng nó không hoạt động. Tôi đã đọc các tài liệu khác nhau nhưng vẫn chưa tìm thấy những gì tôi đang làm sai. Dưới đây là đoạn mã:Không thể vá lớp được tạo ra bởi lớp được kiểm tra bằng cách sử dụng

Trong tests/Test.py:

from module.ClassToTest import ClassToTest 

class Test(object): 

    @mock.patch('module.ClassToPatch.ClassToPatch', autospec = False) 
    def setUp(self, my_class_mock): 
     self.instance = my_class_mock.return_value 
     self.instance.my_method.return_value = "def" 
     self.class_to_test = ClassToTest() 

    def test(self): 
     val = self.class_to_test.instance.my_method() #Returns 'abc' instead of 'def' 
     self.assertEqual(val, 'def') 

Trong module/ClassToPatch.py:

class ClassToPatch(object): 
    def __init__(self): 
     pass 
    def my_method(self): 
     return "abc" 

Trong module/ClassToTest.py:

from module.ClassToPatch import ClassToPatch 

class ClassToTest(object): 
    def __init__: 
     # Still instantiates the concrete class instead of the mock 
     self.instance = ClassToPatch() 

Tôi biết trong trường hợp này tôi có thể dễ dàng tiêm phụ thuộc, nhưng đây chỉ là một ví dụ. Ngoài ra, chúng tôi sử dụng một lớp duy nhất cho mỗi chính sách tệp, với tệp có tên như lớp, do đó đặt tên nhập khẩu lạ.

+2

Hãy thử @ mock.patch ('module.ClassToTest.ClassToPatch', autospec = False) –

+0

Trong tương lai, vui lòng tạo mã mẫu của bạn thành [MCVE] (http://stackoverflow.com/help/mcve); có một số lỗi trong mã được đăng của bạn và bạn không thể dựa vào một người quen thuộc đủ để giải quyết vấn đề ngay lập tức phát hiện vấn đề và đưa ra giải pháp. –

+0

Ok tôi sẽ lưu ý về nó – sixtstorm1

Trả lời

1

khi Norbert đề cập, việc sửa chữa là thay đổi dòng giả từ

@mock.patch('module.ClassToPatch.ClassToPatch', autospec = False) 

để

@mock.patch('module.ClassToTest.ClassToPatch', autospec = False) 

According to the docs:

Các miếng vá() trang trí/quản lý bối cảnh làm cho nó dễ dàng giả lập các lớp hoặc các đối tượng trong một mô-đun được kiểm tra. Đối tượng bạn chỉ định sẽ được thay thế bằng một mô hình (hoặc đối tượng khác) trong khi kiểm tra và khôi phục khi thử nghiệm kết thúc.

Bạn đang thử nghiệm mô-đun ClassToTest, không phải mô-đun ClassToPatch.

Các vấn đề liên quan