2013-10-08 64 views
0

已解決:此處的示例不準確,未顯示問題。解決方案在下面給出的答案中(我將在本站允許時標記正確)。工廠在調用另一工廠的定義時失敗


我怎麼能導入從不同的應用程序的單元測試模塊工廠,並用它這個測試模塊中創建實例?

我有一個Django項目與幾個應用程序。單元測試使用Factory Boy來創建用於測試的模型實例。 (模型是由South管理,並設置有SOUTH_TESTS_MIGRATE = False的建議。)

在應用bar的單元測試,我想創建的Foo測試實例,在應用程序foo定義的模型。

應用foo的單元測試模塊已經有一個工廠FooFactory,這是廠家我想用:

# foo/tests.py 

import factory 
… 

from . import models 

class FooFactory(factory.Factory): 
    FACTORY_FOR = models.Foo 

    spam = 0 
    … 

所以在bar,應用程序,我現在寫試驗,我需要FooFactory。我嘗試導入並使用它:

# bar/tests.py 

import factory 
… 

from . import models 
from foo.tests import FooFactory 

class BarFactory(factory.Factory): 
    FACTORY_FOR = models.Bar 

    foo = factory.SubFactory(FooFactory) 
    … 

class BarTest(TestCase): 
    """ Test cases for ‘Bar’ model. """ 

    def test_frobnicates_to_spanguloid(self): 
     """ The instance should frobnicate to a spanguloid. """ 
     test_foo = FooFactory(code=34) 
     test_bar = BarFactory(foo=test_foo) 

但測試用例失敗django.db.utils.DatabaseError: no such table: foo_foo試圖創建的foo.Foo一個實例。

回答

0

的問題(在簡單的例子並不證明)嘗試調用工廠在另一家工廠的定義:

class BarFactory(factory.Factory): 
    FACTORY_FOR = models.Bar 

    spam = FooFactory(code=34) 

失敗與django.db.utils.DatabaseError: no such table: foo_foo,因爲當Django的測試運行中導入調用時單元測試模塊。那時,沒有模型在數據庫中。

相反,任何對工廠的調用都必須等到測試結果爲運行,而不是在定義類時。在這種情況下:

class BarFactory(factory.Factory): 
    FACTORY_FOR = models.Bar 

    spam = factory.SubFactory(FooFactory) 
    … 

class BarTestCase(TestCase): 

    def setUp(self): 
     """ Set up test fixtures. """ 
     self.test_foo = FooFactory(code=34) 

    def test_frobnicates_to_spanguloid(self): 
     """ The instance should frobnicate to a spanguloid. """ 
     test_bar = BarFactory(foo=self.test_foo)