10

django テストでオブジェクトの 2 つのリストが等しいことを確認する方法はありますか。

私はいくつかのモデルを持っているとしましょう:

class Tag(models.Model):
    slug = models.SlugField(max_length=50, unique=True)
    def __unicode__(self):
        return self.slug

そして、私はこの簡単なテストを実行します:

def test_equal_list_fail(self):
    tag_list = []
    for tag in ['a', 'b', 'c']:
        tag_list.append(Tag.objects.create(slug=tag))

    tags = Tag.objects.all()

    self.assertEqual(tag_list, tags)

これは失敗します:

======================================================================
FAIL: test_equal_list_fail (userAccount.tests.ProfileTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "path/to/tests.py", line 155, in test_equal_list_fail
    self.assertEqual(tag_list, tags)
AssertionError: [<Tag: a>, <Tag: b>, <Tag: c>] != [<Tag: a>, <Tag: b>, <Tag: c>]

----------------------------------------------------------------------

これはうまくいきます:

def test_equal_list_passes(self):
    tag_list = []
    for tag in ['a', 'b', 'c']:
        tag_list.append(Tag.objects.create(slug=tag))

    tags = Tag.objects.all()

    for tag_set in zip(tags, tag_list):
        self.assertEqual(*tag_set)

ただし、これは失敗します。

def test_equal_list_fail(self):
    tag_list = []
    for tag in ['a', 'b', 'c']:
        tag_list.append(Tag.objects.create(slug=tag))

    tags = Tag.objects.all()

    for tag_set in zip(tags, tag_list):
        print "\n"
        print tag_set[0].slug + "'s pk is %s" % tag_set[0].pk
        print tag_set[1].slug + "'s pk is %s" % tag_set[1].pk
        print "\n"
        self.assertIs(*tag_set)

と:

Creating test database for alias 'default'...
.......

a's pk is 1
a's pk is 1

F.
======================================================================
FAIL: test_equal_list_fail (userAccount.tests.ProfileTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "path/to/tests.py", line 160, in test_equal_list_fail
    self.assertIs(*tag_set)
AssertionError: <Tag: a> is not <Tag: a>

これは予想される動作ですか?

コメントに応じて編集
このタイプの比較は次のように機能します。

class Obj:
    def __init__(self, x):
        self.x = x

>>> one = Obj(1)
>>> two = Obj(2)
>>> a = [one, two]
>>> b = [one, two]
>>> a == b
True

他のアレイでテストが失敗するのはなぜですか?

4

2 に答える 2

13

2 つのリストをテストするには

使用: assertSequenceEqual

この場合、 as がリストを作成するwhere をtags = Tag.objects.all()生成するためです。django.db.models.query.QuerySettag_list.append(...)

さまざまな状況でのその他のオプションは次のとおりです。

  • assertListEqual(a, b)
  • assertTupleEqual(a, b)
  • assertSetEqual(a, b)
  • assertDictEqual(a, b)

どうして<Tag: a> is not <Tag: a>

タグは同じモデルですが、メモリ内の別の場所にロードされています

for tag_set in zip(tags, tag_list):
    print "\n"
    print tag_set[0].slug + "'s pk is %s" % tag_set[0].pk + ' id is: ' + id(tag_set[0])
    print tag_set[1].slug + "'s pk is %s" % tag_set[1].pk + ' id is: ' + id(tag_set[1])
    print "\n"
    self.assertIs(*tag_set)

戻り値

.......

a's pk is 1 id is: 4522000208
a's pk is 1 id is: 4522228112

F.

したがって、is再実行しますFalse

于 2014-06-04T04:12:38.927 に答える
3

あなたがテストしたいのは、作成されたタグにテストリストのスラッグと同じスラッグがあるかどうかだと思います。

そのために、スラッグのみを でリストとして取得しvalues_list、それを比較します。

assertEqual(Tag.objects.values_list('slug', flat=True), ['a','b','c'])

すでに十分にテストされているdjango orm機能をチェックしているため、これはあまり有用なテストではないと言わざるを得ません。

テストでは、独自のアプリケーションの詳細を確認する必要があります。

于 2014-06-02T04:29:17.673 に答える