новый экземпляр класса не инициализируется - PullRequest
2 голосов
/ 27 апреля 2011

Я пишу пакет и выполняю тестирование, как хороший маленький программист, но вот что происходит:

class TestOne(unittest.TestCase):
    def setUp(self):
        self.finder = Finder()

    def test_default_search_parts(self):
        self.assertEqual(self.finder.search_parts, [])

class TestTwo(unittest.TestCase):
    def setUp(self):
        self.finder = Finder()

    def test_add_letter(self):
        self.finder.add('a')
        self.assertNotEqual(self.finder.search_parts, [])

в этом случае test_default_search_parts завершается неудачно с AssertionError: ['a'] != [] и test_add_letter проходит.Я не знаю, что здесь происходит.Становится очень странно, когда я переписываю test_default_search_parts:

def test_default_search_parts(self):
    f = Finder()
    self.assertEqual(f.search_parts, [])

, происходит тот же сбой.Что я делаю не так с инициализацией моих экземпляров?

О, и я использую нос для запуска их, если это имеет значение.

1 Ответ

4 голосов
/ 27 апреля 2011

Как уже упоминалось @samplebias, общее состояние, в данном случае с атрибутами уровня класса, может вызвать проблемы. Вот возможная ситуация у вас:

import unittest

# bad implementation of Finder, class-level attribute
class Finder(object):
    search_parts = []

    def add(self, letter):
        self.search_parts.append(letter)


# using 'Zne' here makes sure this test is run second        
class TestZne(unittest.TestCase):
    def setUp(self):
        print 'I am run next'
        self.finder = Finder()

    def test_default_search_parts(self):
        self.assertEqual(self.finder.search_parts, [])


class TestTwo(unittest.TestCase):
    def setUp(self):
        print 'I am run first'
        self.finder = Finder()

    def test_add_letter(self):
        self.finder.add('a')
        self.assertNotEqual(self.finder.search_parts, [])

unittest.main()

Выходы

Traceback (most recent call last):
  File "test.py", line 18, in test_default_search_parts
    self.assertEqual(self.finder.search_parts, [])
AssertionError: Lists differ: ['a'] != []

Проблема в том, что все экземпляры Finder совместно используют этот атрибут уровня класса search_parts, а add_letter запускается перед тестом поиска по умолчанию.

Чтобы решить, используйте что-то вроде:

class Finder(object):
    def __init__(self):
        self.search_parts = []

Это обеспечит только атрибут instance .

...