2012-04-15 11 views
3

私はdjango models.Modelでsaveメソッド呼び出しを模倣しようとしています。 私はモックライブラリとしてモックを使用しています。djangoのデータベースを保存する

私はapps.deps.house_factoryにあるファイルhouse_factory.pyの関数をテストしています。

house_factory.py:apps.market.modelsから が、私は家のモデルをモックとしたいハウス

def create_house(location, date, price): 
    house = House(id=None, date, price) 
    house.save() 

    # calculate some stuff and further expand the house instance 
    # for example house.tag.add("some-tag") 

    # save after calculations 
    house.save() 

をインポートします。 、(

call__ 戻りself.call *引数:

class HouseModelMock(mock.Mock): 
    def save(self): 
     pass 

試験方法は、たunittest.TestCaseクラス

@patch('apps.deps.house_factory.House', new_callable=HouseModelMock) 
    def create_house_test(self, MockedHouse): 

     """ Constants """ 
     DAYS_FROM_TODAY = 55 
     DATE = datetime.date.today() + datetime.timedelta(days=DAYS_FROM_TODAY) 
     PRICE = 250000 

    # A location is also a django module , I'm using factory_boy here for building a 'mocked' location 
     location = LocationFactory.build() 

     create_house(DATE, PRICE) 
     MockedHouse.assert_called_with(None, DATE, PRICE) 
     MockedHouse.save.assert_called_with() 

私は取得しています。このテストを実行する場合の一部であり、 ** kw) MemoryError

これは私の最初の試みは、djangoとテストに深刻なものです。だから、私は間違ったことを設定して、データベース呼び出しを模倣しているかもしれません。

ご協力いただけると幸いです。

Jonas

答えて

3

"これはDjangoで深刻な問題を抱えてテストするための最初の試みの1つです..." python manage.py testを実行するたびにデータベース保存をDjangoとして自動的にcreates a test DBテストスイートを実行する必要はありません。次に、DBに格納されている値をアサートします。

理想的には、mockは、デフォルトのDjangoのものではなく、独自のテスト(およびロジック)を修正するために使用されます。

ヒント:単体テスト用のメモリDBでを使用するなど、sqliteは、あなたのsettings.pyファイルに以下置く:

if 'test' in sys.argv: 
    DATABASES['default']['ENGINE'] = 'sqlite3' 

これはかなりあなたのテストの実行を高速化します。

関連する問題