1

Pythonユニットテストを使用してクラスをテストしようとしていますが、テストスイートが基本クラスを変更しているようです

問題を示すためのいくつかの擬似コードを次に示します。

クラス

// module cards...
class deck():

    def __init__(self, cards):
        self.__cards = cards

    def __len__(self):
        return len(self.__cards)

    def draw(self, n = 1):
        '''
        remove and return n cards
        from internal card list

        n -- integer
        @return list removed
        '''
        removed      = self.__cards[0:n]
        remaining    = self.__cards[n:]
        self.__cards = remaining
        return removed

    def addOne(self, card):
        '''
        add single card to the deck
        '''
        self.__cards.append(card)

    def addMany(self, cards):
        '''
        add many cards to the deck
        '''
        self.__cards.extend(cards)

インスタンスにデータを入力するためのフィクスチャは、おそらくファイルまたはDBクエリの出力になります

//source
src = [
{
    'id'          : 1,
    'name'        : 'one',
    'description' : 'this is one'
},
{
    'id'          : 2,
    'name'        : 'two',
    'description' : 'this is two'
},
{
    'id'          : 3,
    'name'        : 'three',
    'description' : 'this is three'
},
{
    'id'          : 4,
    'name'        : 'four',
    'description' : 'this is four'
},
{
    'id'          : 5,
    'name'        : 'five',
    'description' : 'this is five'
}
]

テスト

from source import src
import cards 

def test_drawRemovesOne(self):
    deck = cards.deck(src)
    self.assertTrue(callable(deck.draw))

    # single card
    deckSize  = len(deck)
    drawnCard = deck.draw(1)
    self.assertEqual(drawnCard[0]['id'], 1)
    self.assertEqual(4, len(deck))
    self.assertEqual(len(drawnCard), 1)



def test_drawRemovesMany(self):
    deck = cards.deck(src)
    deckSize   = len(deck)
    drawnCards = deck.draw(3)
    self.assertEqual(drawnCards[0]['id'], 1)
    self.assertEqual(drawnCards[1]['id'], 2)
    self.assertEqual(drawnCards[2]['id'], 3)
    self.assertEqual(len(deck), 2)
    self.assertEqual(len(drawnCards), 3)


'''
INVALIDATES PREVIOUS TESTS...
def test_addOne(self):
    deck = cards.deck(src)
    card = {
        'id'          : 9,
        'name'        : 'nine',
        'description' : 'this is nine'
    }
    deckSize = len(deck)
    deck.addOne(card)
    newDeckSize = len(deck)
    self.assertTrue(newDeckSize == deckSize + 1)
'''

編集:投稿された実際のスニペット

最初のテストは合格しますが、2番目のテストが実装されるとその後失敗します。新しいインスタンスのように見えますが、テストメソッドによって共有されているクラスへの参照が1つあるように見えます。

私はPythonでほんの少しの作業を行っただけですが、これは私が気付いていない言語の特殊性の結果ですか?

4

1 に答える 1

1

このコードを参照してください

>>> class Deck:
...     def __init__(self, cards):
...         self.cards = cards
>>> l0 = [1, 2, 3]
>>> d1 = Deck(l0)
>>> d2 = Deck(l0)
>>> d1.cards
0: [1, 2, 3]
>>> d2.cards
1: [1, 2, 3]
>>> d1.cards.append(4)
>>> d2.cards
2: [1, 2, 3, 4]    # d1 and d2 share the same list for cards

あなたは両方のテストをから始めますが、それがどこから来ているのdeck = cards.deck(src)かわかりません。srcsetUpメソッドで新しいオブジェクトとして作成されていない場合は、テストケース間で共有されている可能性があります。

于 2012-05-30T22:48:19.970 に答える