2012-09-25 15 views
7

Giả sử rằng chúng tôi có một hệ thống mô-đun chỉ tồn tại trên giai đoạn sản xuất. Tại thời điểm thử nghiệm các mô-đun này không tồn tại. Nhưng tôi vẫn muốn viết các bài kiểm tra cho mã sử dụng các mô-đun đó. Cũng giả sử rằng tôi biết làm thế nào để giả lập tất cả các đối tượng cần thiết từ các mô-đun đó. Câu hỏi đặt ra là: làm cách nào để tôi thuận tiện thêm phân đoạn mô-đun vào hệ thống phân cấp hiện tại?Làm cách nào để giả lập cấu trúc phân cấp của các mô-đun không tồn tại?

Đây là một ví dụ nhỏ. Chức năng Tôi muốn thử nghiệm được đặt trong một tập tin gọi là actual.py:

actual.py: 


def coolfunc(): 
    from level1.level2.level3_1 import thing1 
    from level1.level2.level3_2 import thing2 
    do_something(thing1) 
    do_something_else(thing2) 

Trong bộ kiểm tra của tôi, tôi đã có tất cả mọi thứ tôi cần: Tôi có thing1_mockthing2_mock. Ngoài ra tôi có một chức năng kiểm tra. Những gì tôi cần là để thêm level1.level2... vào hệ thống mô-đun hiện tại. Như thế này:

tests.py 

import sys 
import actual 

class SomeTestCase(TestCase): 
    thing1_mock = mock1() 
    thing2_mock = mock2() 

    def setUp(self): 
    sys.modules['level1'] = what should I do here? 

    @patch('level1.level2.level3_1.thing1', thing1_mock) 
    @patch('level1.level2.level3_1.thing1', thing2_mock) 
    def test_some_case(self): 
    actual.coolfunc() 

Tôi biết rằng tôi có thể thay thế sys.modules['level1'] bằng một đối tượng có chứa một đối tượng khác, v.v. Nhưng có vẻ như rất nhiều mã cho tôi. Tôi cho rằng phải có nhiều giải pháp đơn giản hơn và đẹp hơn. Tôi không thể tìm thấy nó.

Trả lời

9

Vì vậy, không ai giúp tôi giải quyết vấn đề của mình và tôi quyết định tự giải quyết. Here là một vi-lib được gọi là surrogate cho phép người ta tạo ra các nhánh cho các mô-đun không tồn tại.

Lib có thể được sử dụng với mock như thế này:

from surrogate import surrogate 
from mock import patch 

@surrogate('this.module.doesnt.exist') 
@patch('this.module.doesnt.exist', whatever) 
def test_something(): 
    from this.module.doesnt import exist 
    do_something() 

Thứ nhất @surrogate trang trí tạo khai cho các module không tồn tại, sau đó @patch trang trí có thể thay đổi chúng. Cũng giống như @patch, @surrogate trang trí có thể được sử dụng "ở dạng số nhiều", do đó kéo dài nhiều hơn một đường dẫn mô-đun. Tất cả các sơ khai chỉ tồn tại ở tuổi thọ của chức năng được trang trí.

Nếu có ai sử dụng lib này, điều đó sẽ tuyệt vời :)

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