2012-04-23 46 views
22
def f1(): 
    return 10, True 

def f2(): 
    num, stat = f1() 
    return 2*num, stat 

Làm thế nào để sử dụng thư viện mock python để vá f1() và trả về một kết quả tùy chỉnh để tôi có thể kiểm tra f2()?Python vá giả một chức năng trong một chức năng

Đã chỉnh sửa: Có vấn đề gì với thử nghiệm của tôi không? Đây dường như không được làm việc, tất cả các cuộc thử nghiệm thất bại với AssertionError

from foo.bar import f2 
from mock import patch 

class MyTest(TestCase): 

    def test_f2_1(self): 
     with patch('project.module.f1') as some_func: 
      some_func.return_value = (20, False) 
      num, stat = f2() 
      self.assertEqual((num, stat), (40, False)) 

    @patch('project.module.f1') 
    def test_f2_2(self, some_func): 
     some_func.return_value = (20, False) 
     num, stat = f2() 
     self.assertEqual((num, stat), (40, False)) 

Trả lời

11

Ví dụ đầu tiên cho thấy rằng f1() và f2() được xác định trong cùng một mô-đun. Do đó những điều sau đây nên làm việc:

from foo.bar import f2 
from mock import patch 

class MyTest(TestCase): 

    @patch('foo.bar.f1') 
    def test_f2_2(self, some_func): 
     some_func.return_value = (20, False) 
     num, stat = f2() 
     self.assertEqual((num, stat), (40, False)) 

Patch là trên giống như nhập khẩu: @patch('foo.bar.f1')

Đây là một câu trả lời tốt về vấn đề này:

http://bhfsteve.blogspot.nl/2012/06/patching-tip-using-mocks-in-python-unit.html

+1

Cảm ơn bạn đã giới thiệu liên kết http://bhfsteve.blogspot.nl về kiểu vá và nhập. Điều đó giải quyết được một trong những vấn đề của tôi. – HeyWatchThis

17

Giả sử rằng bạn đang sử dụng mock THƯ VIỆN này:

def f1(): 
    return 10, True 

def f2(): 
    num, stat = f1() 
    return 2*num, stat 

import mock 

print f2() # Unchanged f1 -> prints (20, True) 

with mock.patch('__main__.f1') as MockClass:  # replace f1 with MockClass 
    MockClass.return_value = (30, True)  # Change the return value 

    print f2()  # f2 with changed f1 -> prints (60, True) 

Nếu mã của bạn được chia thành các module có thể bạn sẽ cần để thay thế __main__.f1 bằng đường dẫn đến mô-đun/chức năng của bạn.

+0

Nó sẽ thực hiện bất kỳ sự khác biệt nếu f1() chấp nhận args? Ví dụ: f1 (arg) –

+0

Hàm mocking có thể được gọi với bất kỳ số lượng đối số nào, nó sẽ luôn trả về 'return_value'. –

+0

Cảm ơn rất nhiều @Secator. Tôi đã cập nhật câu hỏi của mình với một trường hợp kiểm tra và dường như nó không được chuyển. Tôi đang làm gì sai? –

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