2012-04-12 30 views
5

Tôi có một bộ kiểm tra (sử dụng mũi, không phải là không có), và tôi muốn vá một hàm để trả về một chuỗi giá trị cụ thể cho mọi thử nghiệm trong lớp thử nghiệm. Nỗ lực đầu tiên của tôi, sử dụng một ví dụ đơn giản, là:Vá một hàm bằng cách sử dụng Mock

@patch('time.clock', MagicMock(side_effects=[1, 2])) 
class Tests: 
    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

Tuy nhiên, trường hợp MagicMock chỉ được tạo ra một lần, vì vậy thử nghiệm thứ hai thất bại khi các tác dụng phụ chạy ra ngoài. Tôi có thể vá từng phương pháp thử nghiệm một cách riêng biệt, nhưng tôi không thực sự muốn sao chép trang trí bản vá trên tất cả chúng (có nhiều thử nghiệm hơn trong ví dụ này!) Cách khác tôi có thể làm là tạo bản vá trong mã thiết lập như sau:

class Tests: 
    def setup(self): 
     self.old_clock = time.clock 
     time.clock = MagicMock(side_effects=[1, 2]) 

    def teardown(self): 
     time.clock = self.old_clock 

    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

Tuy nhiên, lưu và khôi phục định nghĩa ban đầu có vẻ như một cái gì đó mà Mock sẽ có thể thực hiện tự động. Có cách nào khác để làm điều này mà tôi đang thiếu? Hay là ví dụ cuối cùng của tôi là cách tốt nhất để làm điều này?

Trả lời

2
a = (x for x in [1,2]) 

x = lambda : next(a) 

x() 

Out: 1

x() 

Out: 2

Đặt câu trả lời của bạn vào một danh sách. Thay đổi X cho tên bạn muốn.

+0

Tôi không có ý tưởng những gì bạn đang nhận được tại đây. Dường như không liên quan gì đến câu hỏi này, và trông giống như một cách viết phức tạp 'x = [1, 2] .__ iter __(). Next'. Bạn đang cố nói điều gì vậy? – aquavitae

+0

. Bạn muốn một cách để creare một mô hình của một chức năng. Bây giờ bạn đã ra lệnh cho những người bảo trợ. Không? x = ["Phản hồi đầu tiên của bạn", "Giải pháp thứ hai của bạn", "... vv"] .__ iter __(). Next Giải quyết vấn đề. – Nasgar

+0

Tôi biết cách tạo một trình lặp và mô phỏng một hàm. Câu hỏi của tôi là liệu có một cách dễ dàng để thiết lập lại mô hình cho mọi chức năng kiểm tra hay không. – aquavitae

1

Bạn chỉ nên áp dụng các bản vá cho mọi kiểm tra, thay vì áp dụng nó vào trong lớp:

class Tests: 
    @patch('time.clock', MagicMock(side_effects=[1, 2])) 
    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    @patch('time.clock', MagicMock(side_effects=[1, 2])) 
    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 
Các vấn đề liên quan