2009-06-21 34 views
22

Tôi muốn viết một doctest như thế này:Có thể doctest python bỏ qua một số dòng đầu ra?

""" 
>>> print a.string() 
      foo : a 
      bar : b 
     date : <I don't care about the date output> 
      baz : c 
""" 

Có cách nào để làm điều này? Tôi nghĩ rằng nó sẽ có ý nghĩa hơn để chuyển sang unittest, nhưng tôi tò mò cho dù nó có thể xác định một loạt các đầu ra mà không nên được xuất hiện cho các thử nghiệm trong doctest.

Cảm ơn!

Trả lời

31

Với doctest.ELLIPSIS, bạn có thể sử dụng ... để có nghĩa là "khớp với bất kỳ chuỗi nào tại đây". Bạn có thể đặt doctest tùy chọn với một chỉ thị doctest, để làm cho nó hoạt động đối với trường hợp chỉ là một thử nghiệm: một ví dụ trong online docs là:

>>> print range(20) # doctest:+ELLIPSIS 
[0, 1, ..., 18, 19] 

Nếu bạn muốn có một tùy chọn doctest là hoạt động xuyên suốt, bạn có thể vượt qua nó như đối số optionflags= cho bất kỳ hàm doctest nào bạn sử dụng, ví dụ doctest.testfile. (Bạn có thể vượt qua nhiều cờ tùy chọn ở đó bằng cách sử dụng toán tử | cho bit hoặc chúng).

+1

Nhưng làm cách nào chúng tôi có thể bỏ qua toàn bộ dòng? –

+1

@ t0ster, chỉ cần đặt '...' làm toàn bộ "đầu ra dự kiến" (với tập hợp 'doctest.ELLIPSIS', dĩ nhiên) và doctest sẽ chấp nhận bất kỳ nội dung nào trên dòng đầu ra đó, tức là"bỏ qua toàn bộ dòng" của đầu ra. –

+5

"bỏ qua toàn bộ dòng" như trên không hoạt động vì doctest gây nhầm lẫn với dấu chấm lửng với sự tiếp nối (python) của dòng trước đó. Tôi không thể tìm thấy bất kỳ cách nào để bỏ qua toàn bộ dòng. Trên thực tế, tôi đã tìm kiếm "bỏ qua toàn bộ đầu ra". –

4

Bỏ qua toàn bộ dòng có chút khó khăn. Tại đây:

""" 
>>> do_your_thing() #doctest:+ELLIPSIS 
... 
""" 

Dấu ba chấm sẽ được hiểu là tiếp tục dòng và gây ra lỗi cú pháp.

Nếu bạn muốn bỏ qua toàn bộ dòng, bạn sẽ cần một cái gì đó như:

""" 
>>> sys.stdout.write('skip from here '); do_your_thing() #doctest:+ELLIPSIS 
skip from here ... 
""" 
+0

Cảm ơn, đây là một hack hữu ích! –

8

Đối phó với những câu hỏi về "làm thế nào chúng ta có thể bỏ qua toàn bộ dòng": yes, thực tế là" ... "cũng giống như một sự tiếp tục như làm cho nó khó để bỏ qua toàn bộ đầu ra. Bạn có thể sử dụng "#doctest: + SKIP" nếu bạn chỉ muốn bỏ qua hoàn toàn ví dụ, nhưng điều đó sẽ không hoạt động nếu bạn đang dựa vào các tác dụng phụ của nó. Nếu bạn thực sự cần phải làm điều này, tôi cho rằng bạn có thể khỉ vá các mô-đun doctest bản thân, mặc dù tôi sẽ không đặc biệt khuyên nó: (. Kiểm tra này đi)

>>> import doctest 
>>> doctest.ELLIPSIS_MARKER = '-etc-' 
>>> print 12 # doctest: +ELLIPSIS 
-etc- 

Hoặc bạn tạm thời có thể ngăn chặn stdout và/hoặc stderr: (. kiểm tra này cũng đi)

>>> # Suppress stdout 
>>> import sys 
>>> class DevNull: 
...  def noop(*args, **kwargs): pass 
...  close = write = flush = writelines = noop 
>>> sys.stdout = DevNull() 
>>> # Run a test and ignore output (but we need its side effects) 
>>> print 12 # NOTE: stdout is suppressed! 
>>> # Restore stdout 
>>> sys.stdout = sys.__stdout__ 

0

Can I have an ellipsis at the beginning of the line in a Python doctest? exp làm thế nào để tạo ra một bộ kiểm tra đầu ra tùy chỉnh sử dụng một chuỗi bổ sung làm dấu ba chấm. Điều này sẽ cho phép bạn viết những điều sau đây, trong khi vẫn sử dụng '...' ở nơi khác.

def foo(): 
    """ 
    >>> foo() # doctest: +ELLIPSIS 
    [...] world 
    """ 
    print "hello world" 
5

tôi tìm thấy nó dễ dàng hơn để chỉ đơn giản là gán các giá trị trả lại không cần thiết cho một biến:

>>> _ = do_something() 
>>> check_something() 
True 
+0

đơn giản nhất, bravo – michaelsnowden

1

Bạn có thể viết các bộ trước và sau khi chức năng của bạn (hack lấy cảm hứng từ câu trả lời của Mark Horvath):

def foo(): 
    """ 
    >>>();foo();() # doctest: +ELLIPSIS 
    (...) 
    """ 
    print "Hello world" 
    return "Hello world" 
Các vấn đề liên quan