2016-07-05 18 views
8

Tôi có một tệp python a.py chứa hai lớp AB.Python trả về đối tượng MagicMock thay vì return_value

class A(object): 
    def method_a(self): 
     return "Class A method a" 

class B(object): 
    def method_b(self): 
     a = A() 
     print a.method_a() 

Tôi muốn UnitTest method_b trong lớp B bởi chế giễu A. Dưới đây là nội dung của tập tin testa.py cho mục đích này:

import unittest 
import mock 
import a 


class TestB(unittest.TestCase): 

    @mock.patch('a.A') 
    def test_method_b(self, mock_a): 
     mock_a.method_a.return_value = 'Mocked A' 
     b = a.B() 
     b.method_b() 


if __name__ == '__main__': 
    unittest.main() 

tôi mong muốn nhận được Mocked A trong đầu ra. Nhưng những gì tôi nhận được là:

<MagicMock name='A().method_a()' id='4326621392'> 

Tôi đang làm gì sai?

+1

Khi thử nghiệm, 'A()' trả về 'return_value' từ' mock_A' (một 'MagicMock' thông thường, vì bạn chưa chỉ định bất kỳ điều gì khác), không phải là một thể hiện của lớp' A'. Bạn cần đặt 'return_value' thành một cái gì đó có' phương thức'a' đã được định nghĩa. – jonrsharpe

+1

mock_a.method_a.return_value = 'Mocked A' => mock_a(). Method_a.return_value = 'Mocked A' nên tốt hơn :) –

+0

@AliSAIDOMAR chính xác là giá trị trả về khi gọi 'mock_a' cần có phương thức, không phải 'mock_a'. – jonrsharpe

Trả lời

7

Khi bạn @mock.patch('a.A'), bạn đang thay thế lớp A trong mã đang được thử nghiệm với mock_a.

Trong B.method_b bạn sau đó thiết lập a = A(), mà bây giờ a = mock_a() - ví dụ: areturn_value của mock_a. Vì bạn chưa chỉ định giá trị này, đây là giá trị thông thường MagicMock; điều này cũng không được cấu hình, vì vậy bạn sẽ nhận được phản hồi mặc định (thêm MagicMock) khi gọi các phương thức trên đó.

Thay vào đó, bạn muốn cấu hình các return_value của mock_a để có phương pháp thích hợp, mà bạn có thể làm là một trong hai:

mock_a().method_a.return_value = 'Mocked A' 
    #^note parentheses 

hoặc, có lẽ một cách rõ ràng hơn:

mock_a.return_value.method_a.return_value = 'Mocked A' 

của bạn mã có thể đã làm việc trong trường hợp a = A (gán lớp, không tạo ra một cá thể), như sau đó a.method_a() sẽ kích hoạt phương thức mô phỏng của bạn.

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