2010-10-01 28 views

Trả lời

6

Để đơn vị kiểm tra một cái gì đó như thế này, bạn phải giả lập/stub ra phụ thuộc của bạn. Trong trường hợp này, hãy nói rằng bạn đang khởi động vim bằng cách gọi os.system ("vim").

Trong thử nghiệm đơn vị của bạn, bạn có thể còn sơ khai ra rằng chức năng cuộc gọi làm một cái gì đó như:

def launchVim(): 
    os.system("vim") 

def testThatVimIsLaunched(): 
    try: 
     realSystem = os.system 
     called = [] 
     def stubSystem(command): 
      if command == "vim": 
       called.append(True) 
     os.system = stubSystem 

     launchVim() # function under test 

     assert(called == [True]) 
    finally: 
     os.system = realSystem 

Để biết thêm chi tiết về chế giễu và stubbing hãy nhìn vào this article

Cập nhật: Tôi thêm try/cuối cùng để khôi phục chức năng hệ thống ban đầu theo đề xuất của Dave Kirby

+0

Nếu bạn thực hiện việc này, hãy đảm bảo bạn thực hiện cuộc gọi: thử: cuối cùng: chặn hoặc sử dụng thiết lập & tearDown để khôi phục os.system ban đầu sau đó. Nếu không, bạn cuối cùng sẽ viết một bài kiểm tra trong một phần không liên quan của bộ thử nghiệm của bạn mà cố gắng gọi os.system thực và được gãi đầu tự hỏi tại sao nó không hoạt động. –

+0

Khỉ-vá theo cách này là khá phức tạp. Nếu mã được chế nhạo đã được giữ một tham chiếu đến os.system trước khi bạn vá nó, bản vá sẽ không có hiệu ứng mong muốn. Ngoài ra, đây chính xác là những gì mà gói (đã được xây dựng sẵn) hiện ra, vì vậy hãy sử dụng thay thế :) Nhưng giải pháp của tôi dưới đây mô tả cách kiểm tra mã mà không cần vá bất kỳ ở tất cả –

4

Đây không còn là việc hủy kiểm tra nhưng tích hợp. Tại sao bạn cần khởi động vim? Thông thường, bạn sẽ 'mô phỏng' điều này, mô phỏng quá trình sinh sản và phụ thuộc vào thực tế là mô-đun con xử lý con trăn được kiểm tra tốt.

Để thực hiện điều này trong mã của bạn, bạn có thể, ví dụ, phân lớp lớp thực hiện chức năng của bạn và ghi đè phương thức chịu trách nhiệm sinh sản. Sau đó kiểm tra phân lớp này. I E.

class VimSpawner(object): # your actual code, to be tested 
    ... 
    def spawn(self): 
     ... do subprocess magic 

    def other_logic(self): 
     ... 
     self.spawn() 

class TestableVimSpawner(VimSpawner): 
    def spawn(self): 
     ... mock the spawning 
     self.ididit = True 

class Test(..): 
    def test_spawning(self): 
     t = TestableVimSpawner() 
     t.other_logic() 
     self.failUnless(t.ididit) 
+0

'iditit' là gì ? – GiantsLoveDeathMetal

+0

Đó là lỗi đánh máy :-) –

+0

Bạn vẫn không chắc chắn nó là gì? – GiantsLoveDeathMetal

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