2013-08-30 28 views
15

Vì vậy, tôi có nhiều tín hiệu và trình xử lý khác nhau được gửi qua các ứng dụng. Tuy nhiên, khi tôi thực hiện kiểm tra/vào 'chế độ thử nghiệm', tôi muốn các trình xử lý này bị vô hiệu hóa.Muốn tắt tín hiệu trong thử nghiệm Django

Có cách Django cụ thể để tắt tín hiệu/trình xử lý khi ở chế độ thử nghiệm không? Tôi có thể nghĩ ra một cách rất đơn giản (bao gồm cả các xử lý trong một điều khoản TESTING) nhưng tôi đã tự hỏi nếu có một cách tốt hơn được xây dựng vào Django? ...

+0

Có lẽ bạn có thể khai báo biến cờ trong settings_test.py của mình và chỉ ràng buộc các tín hiệu khi cờ này là sai. Giống như cờ 'DEBUG'. Một cách dễ dàng là tạo các chức năng tín hiệu của riêng bạn. Tôi sẽ được đăng cho cách tiếp cận thanh lịch nhất. – danihp

Trả lời

4

Không, không có. Bạn có thể dễ dàng thực hiện một kết nối có điều kiện mặc dù:

import sys 

if not 'test' in sys.argv: 
    signal.connect(listener, sender=FooModel) 
+0

Phải, vâng ... Đó là những gì tôi nghĩ sẽ là một cách đơn giản. Cảm ơn – user2564502

+0

Tốt. Nếu đó là một câu trả lời chấp nhận được, bạn có thể chính thức chấp nhận nó sau đó không? :) – Germano

+0

Tôi sẽ:) .... Cố gắng chấp nhận nó ban đầu nhưng phải chờ trước khi tôi có thể chấp nhận .... vì vậy đã đi và làm một cái gì đó khác đầu tiên – user2564502

63

Tôi tìm thấy câu hỏi này khi tìm cách để vô hiệu hóa một tín hiệu cho một tập hợp các trường hợp kiểm tra và trả lời Germano của đưa tôi đến với giải pháp nhưng phải mất cách tiếp cận ngược lại vì vậy tôi nghĩ tôi 'd thêm nó.

Trong lớp thử nghiệm của bạn:

class MyTest(TestCase): 
    def setUp(self): 
     # do some setup 
     signal.disconnect(listener, sender=FooModel) 

Thay vì thêm mã quyết định thêm các tín hiệu tôi thay vì vô hiệu hóa nó tại thời điểm kiểm tra mà cảm thấy như một giải pháp đẹp hơn với tôi (như các bài kiểm tra nên được viết xung quanh mã thay vì mã xung quanh các thử nghiệm). Hy vọng là hữu ích cho một người nào đó trong cùng một chiếc thuyền!

Chỉnh sửa: Kể từ khi viết bài này, tôi đã được giới thiệu một cách khác để tắt tín hiệu để thử nghiệm. Điều này đòi hỏi gói factory_boy (v2.4.0 +) rất hữu ích để đơn giản hóa các thử nghiệm ở Django. Bạn tha hồ lựa chọn thực sự:

import factory 
from django.db.models import signals 

class MyTest(TestCase): 
    @factory.django.mute_signals(signals.pre_save, signals.post_save) 
    def test_something(self): 

Nên biết trước nhờ thẩm mỹ: nó mutes tín hiệu bên trong nhà máy và khi một đối tượng được tạo ra, nhưng không tiếp tục bên trong kiểm tra khi bạn muốn thực hiện rõ ràng tiết kiệm() - tín hiệu sẽ được hiển thị ở đó. Nếu đây là một vấn đề sau đó sử dụng ngắt kết nối đơn giản trong thiết lập có lẽ là con đường để đi.

+0

Tôi thích tùy chọn cuối cùng đó. Những gì tôi phải nhập khẩu là'´signals´´? từ tín hiệu nhập django.db.models, phải không? – kiril

+0

@kiril yeah đó là một, tôi sẽ thêm nó vào câu trả lời của tôi. – krischan

+1

@krischan Mô-đun 'nhà máy' bạn đang nhập trên dòng đầu tiên của ví dụ thứ hai là gì? –

9

Dưới đây là ví dụ đầy đủ về nhập khẩu về cách tắt một tín hiệu cụ thể trong thử nghiệm, nếu bạn không muốn sử dụng FactoryBoy.

from django.db.models import signals 
from myapp.models import MyModel 

class MyTest(TestCase): 

    def test_no_signal(self): 
     signals.post_save.disconnect(sender=MyModel, dispatch_uid="my_id") 

     ... after this point, the signal is disabled ... 

này nên được kết hợp với máy thu của bạn, ví dụ này sẽ phù hợp với thu này:

@receiver(post_save, sender=MyModel, dispatch_uid="my_id") 

Tôi cố gắng để vô hiệu hóa các tín hiệu mà không chỉ định các dispatch_uid và nó đã không làm việc.

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