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.
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