2012年10月14日日曜日

Djangoでテストをするときのfixture

データベースの操作がちゃんとできているのかを確認したかったのでテスト用データベースに初期値を与えたかったのですが,思いの外時間がかかったのでメモを残します. Django1.4です
ファイルはこのような構成になります.

.
├── manage.py
└── warfield
    ├── __init__.py
    ├── fixtures
    │   └── test.json
    ├── models.py
    ├── settings.py
    ├── templates
    │   └── index.html
    ├── tests.py
    ├── urls.py
    ├── views.py
    └── wsgi.py
fixtures/test.jsonがテスト時にデータベースに初期値として与える情報が入ったjsonです.
test.jsonのtest部分については名前を自由に変更することができますが,拡張子と,これを置くfixturesディレクトリの名前を変更してはいけません. test.jsonの中身はこのように書きます
[
  {
    "pk": 1,
    "model": "project_name.user",
    "fields": {
      "name": "hogepiyo"
    } 
  }
]
pkはプライマリーキーです.
modelはproject_name.models.userではなく,project_name.userです.
project_nameとuserは環境に合わせてください.

tests.pyは以下のような内容にします.
from django.test import TestCase, Client, utils

class GetUserTestCase(TestCase):
    fixtures = ['test.json']

    def setUp(self):
        utils.setup_test_environment()
        self.client = Client()

    def testSample(self):
        res = self.client.post('/user')
        self.assertEquals('hogepiyo', res.content)

/userにアクセスした時にuserのnameが帰ってくることを期待したテストです.
テストはメソッド名をtestで始める必要があります.

fixtures = ['test.json']を書くことで,各テストメソッドが呼ばれる前にデータベースがfixturesで渡したファイルの内容で初期化されます.

views.pyはデータベースからuserを読み込み,そのnameを返す動作をすることを想定しています.

./manage.py test project_nameでテストを実行できます.

0 件のコメント:

コメントを投稿