Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python unittest中奇怪的对象实例行为_Python_Unit Testing - Fatal编程技术网

Python unittest中奇怪的对象实例行为

Python unittest中奇怪的对象实例行为,python,unit-testing,Python,Unit Testing,我试图使用Python unittest测试一个类,但测试套件似乎正在修改基类 下面是一些伪代码来演示这个问题: 班级 // module cards... class deck(): def __init__(self, cards): self.__cards = cards def __len__(self): return len(self.__cards) def draw(self, n = 1): '''

我试图使用Python unittest测试一个类,但测试套件似乎正在修改基类

下面是一些伪代码来演示这个问题:

班级

// 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)
填充实例的fixture可能是文件或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)
'''
编辑:发布真实片段

第一个测试通过,但随后在执行第二个测试时失败。似乎有一个类引用被测试方法共享,尽管看起来是新实例

我在Python中只做了少量工作,这是我不知道的某种语言特性的结果吗?

请参阅此代码

>>> 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)
开始两个测试,但我不知道
src
来自哪里。如果它不是作为新对象在安装方法中创建的,那么它可以在测试用例之间共享。

请参阅此代码

>>> 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)
开始两个测试,但我不知道
src
来自哪里。如果它不是作为新对象在安装方法中创建的,那么它可以在测试用例之间共享。

removeOne方法中的self.collection.pop()?请后退一步。你确定你的
removeOne
做了它应该做的事吗?你在这里发布的代码没有。列表或
MyClass
对象无法与您在此处发布的代码共享。可能是简化时出错了?抱歉,更新了代码段。wierd的问题是第一个测试通过了,但后来的测试使它无效-它似乎修改了同一个类实例。发布一些实际演示问题的代码,而不是伪代码您确定没有过度简化测试用例吗?对象实例化是否完全按照发布的方式进行,或者您是否依赖removeOne方法中的某个
setUp()
?self.collection.pop()?请后退一步。你确定你的
removeOne
做了它应该做的事吗?你在这里发布的代码没有。列表或
MyClass
对象无法与您在此处发布的代码共享。可能是简化时出错了?抱歉,更新了代码段。wierd的问题是第一个测试通过了,但后来的测试使它无效-它似乎修改了同一个类实例。发布一些实际演示问题的代码,而不是伪代码您确定没有过度简化测试用例吗?对象实例化是否完全按照发布的方式进行,或者您是否依赖于某个
设置()
?我认为这也是问题所在-我试图使用单独文件中包含的列表作为固定装置,因此我猜测类中的引用是全局的,每次都被修改。我想这也是问题所在-我试图使用单独文件中包含的列表作为固定装置,因此我猜类中的引用是全局的,并且每次都被修改。