2015-07-31 18 views
5

Ứng dụng tôi đang làm việc rất không đồng bộ. Ứng dụng web chạy rất nhiều tác vụ thông qua cần tây tùy thuộc vào hành động của người dùng. Các nhiệm vụ cần tây chính họ có khả năng tung ra thêm nhiệm vụ.Làm thế nào để kiểm tra mã đơn vị chạy các nhiệm vụ cần tây?

Mã như được hiển thị bên dưới xảy ra trong cơ sở mã của chúng tôi khá thường xuyên.

def do_sth(): 
    logic(); 
    if condition: 
     function1.apply_async(*args) 
    else: 
     function2.apply_asynch(*args) 

Bây giờ chúng tôi muốn bắt đầu thử nghiệm đơn vị bất kỳ mã mới nào mà chúng tôi viết và chúng tôi không chắc chắn cách thực hiện điều này. Những gì chúng tôi muốn khẳng định trong các thử nghiệm đơn vị pytest của chúng tôi là chúng tôi muốn xem liệu hàm 1 có thực sự được gọi hay không. Chúng tôi không nhất thiết phải tự chạy function1 vì chúng tôi sẽ có thử nghiệm đơn vị cho function1.

Tôi không muốn chạy cần tây như một quy trình, tôi cũng không muốn chạy bất kỳ nhà môi giới AMQP nào trong phiên kiểm tra đơn vị.

Điều này có thể đạt được không?

Sửa

Nó được chỉ ra rằng đây là một bản sao của How do you unit test a Celery task?

Nó không phải là. Hãy suy nghĩ về nó. Những gì tôi hỏi là làm thế nào để kiểm tra nếu chức năng đã gọi là function1 thông qua apply_async. Câu hỏi đó là về cách tôi tự kiểm tra function1. Có một sự khác biệt lớn. Tôi đã đánh câu hỏi đó trước khi đóng khung này.

+0

thể trùng lặp của (http://stackoverflow.com/questions/12078667/how-do-you-unit-test-a-celery-task) – olofom

+1

Nó không phải là một bản sao –

+0

Tôi đã thấy câu hỏi đó và nó không phải là những gì tôi yêu cầu. Nếu không rõ, hãy hỏi thêm câu hỏi –

Trả lời

7

Hãy xem thư viện Mock cho phép thay thế các hàm bạn không muốn được gọi bằng "mocks" trông tương tự như các hàm ban đầu để thuyết phục mã gọi nó gọi "thực". Sau đó bạn có thể kiểm tra xem mô hình đã thực sự được gọi và với các tham số nào chưa. Ví dụ: [? Làm thế nào để bạn kiểm tra đơn vị một nhiệm vụ cần tây]

import mock 

def test_do_sth(): 
    with mock.patch('function1.apply_async') as function1_mock: 
     do_sth() 
     assert function1_mock.called 
+1

Lưu ý rằng bạn cũng có thể sử dụng 'function1_mock.assert_called_once_with (* args)' để kiểm tra số lượng cuộc gọi và nếu được gọi với các đối số chính xác. – matino

+0

Bạn cũng có thể sử dụng bản vá làm trang trí cho hàm kiểm tra (trong trường hợp này là test_do_sth), mà tôi thích. –

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