2013-08-30 169 views
15

所以我有各種信號和處理程序通過應用程序發送。但是,當我執行測試/進入'測試模式'時,我希望這些處理程序被禁用。想要在Django測試中禁用信號

在測試模式下是否存在禁用信號/處理程序的Django特定方法?我可以想一個非常簡單的方法(包括在TESTING子句中的處理程序),但我想知道是否有更好的方法構建到Django中?...

+0

也許你可以在你的settings_test.py中聲明一個標誌變量,並且只在該標誌爲false時綁定信號。像'DEBUG'標誌一樣。一個簡單的方法是創建自己的信號功能。我將以最優雅的方式發佈。 – danihp

回答

4

不,沒有。您可以輕鬆雖然條件連接:

import sys 

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

對,是的......這就是我認爲的一個簡單的方法。謝謝 – user2564502

+0

好。如果這是一個可以接受的答案,那麼你能正式接受嗎? :) – Germano

+0

我打算:)....試圖接受它,但必須等待,才能接受....所以去做,並做了其他事情第一 – user2564502

63

我發現看時禁用一組測試案例的信號和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中使用簡單的斷開連接可能是一種方法。

+0

我喜歡最後一個選項。我應該輸入什麼作爲'信號'?從django.db.models導入信號,對不對? – kiril

+0

@ kiril是的,那就是我的答案。 – krischan

+1

@krischan什麼是您在第二個例子的第一行導入的'factory'模塊? –

9

下面是一個完整的例子,介紹如何在測試中禁用特定信號的情況,如果您不想使用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禁用的信號,並沒有奏效。