所以我有各種信號和處理程序通過應用程序發送。但是,當我執行測試/進入'測試模式'時,我希望這些處理程序被禁用。想要在Django測試中禁用信號
在測試模式下是否存在禁用信號/處理程序的Django特定方法?我可以想一個非常簡單的方法(包括在TESTING子句中的處理程序),但我想知道是否有更好的方法構建到Django中?...
所以我有各種信號和處理程序通過應用程序發送。但是,當我執行測試/進入'測試模式'時,我希望這些處理程序被禁用。想要在Django測試中禁用信號
在測試模式下是否存在禁用信號/處理程序的Django特定方法?我可以想一個非常簡單的方法(包括在TESTING子句中的處理程序),但我想知道是否有更好的方法構建到Django中?...
不,沒有。您可以輕鬆雖然條件連接:
import sys
if not 'test' in sys.argv:
signal.connect(listener, sender=FooModel)
對,是的......這就是我認爲的一個簡單的方法。謝謝 – user2564502
好。如果這是一個可以接受的答案,那麼你能正式接受嗎? :) – Germano
我打算:)....試圖接受它,但必須等待,才能接受....所以去做,並做了其他事情第一 – user2564502
我發現看時禁用一組測試案例的信號和Germano的的回答使我解決這個問題,但它採用了相反的做法,所以我想我'd添加它。
在您的測試類:
class MyTest(TestCase):
def setUp(self):
# do some setup
signal.disconnect(listener, sender=FooModel)
增加決策的代碼添加在測試感覺就像一個更好的解決方案,我(作爲測試應圍繞寫的時候,我不是禁用它的信號而不是代碼而不是測試周圍的代碼)。希望對同一船上的人有用!
編輯:由於寫這個我已經介紹了另一種禁用信號測試的方式。這需要factory_boy包(v2.4.0 +),這對於簡化Django中的測試非常有用。你一飽眼福真:
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):
買者得益於UPS:它靜音信號廠內,並創建一個對象的時候,但未進一步測試裏面時要進行明確的保存() - 信號會在那裏取消靜音。如果這是一個問題,那麼在setUp中使用簡單的斷開連接可能是一種方法。
下面是一個完整的例子,介紹如何在測試中禁用特定信號的情況,如果您不想使用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 ...
這應該對你接收器相匹配,這個例子會匹配這個接收器:
@receiver(post_save, sender=MyModel, dispatch_uid="my_id")
我試過不指定dispatch_uid禁用的信號,並沒有奏效。
也許你可以在你的settings_test.py中聲明一個標誌變量,並且只在該標誌爲false時綁定信號。像'DEBUG'標誌一樣。一個簡單的方法是創建自己的信號功能。我將以最優雅的方式發佈。 – danihp