python,在同一个函数中两次存根随机性

时间:2016-08-09 14:27:23

标签: python unit-testing

如何在pickCard()函数中存根被调用两次的deal()函数的输出?我想测试失败和获胜案件 例如,我希望获胜的情况下,第一次pickCard()被调用的值为8card1,第二次给定值10到{{ 1}}。

我尝试过使用@ Mock.patch,但这只适用于一次通话。

我已经使用了card2但是如果我再使用它两次它会覆盖返回值

以下是代码:

self.blackjack.pickCard = MagicMock(return_value=8)

测试文件是:

import random

class Game:
    def __init__(self):
        self.cards = [1,2,3,4,5,6,7,8,9,10]

    def deal(self):
        card1 = self.pickCard()
        self.removeCards(card1)
        card2 = self.pickCard()
        return card1  + card2  > 16

    def pickCard(self):
        return random.choice(self.cards)

    def removeCards(self,card1):
        return self.cards.remove(card1)

修改

我用上面的代码运行了这个测试,我得到了这个堆栈跟踪而不是传递

import unittest
from mock import MagicMock
import mock
from lib.game import Game

class TestGame(unittest.TestCase):
    def setUp(self):
        self.game = Game()

    def test_0(self):#passing
        """Only cards from 1 to 10 exist"""
        self.assertListEqual(self.game.cards, [1,2,3,4,5,6,7,8,9,10])

    #Here is where I am finding difficulty writing the test
    def test_1(self):
        """Player dealt winning card"""
        with mock.patch('lib.game.Game.pickCard') as mock_pick:
            mock_pick.side_effect = (8, 10)
            g = Game()
            g.pickCard()
            g.pickCard()
            self.assertTrue(self.game.deal())

我是否需要将两个Traceback (most recent call last): tests/game_test.py line 26 in test_1 self.assertTrue(self.game.deal()) lib/game.py line 8 in deal card1 = self.pickCard() /usr/local/lib/python2.7/site-packages/mock/mock.py line 1062 in __call__ return _mock_self._mock_call(*args, **kwargs) /usr/local/lib/python2.7/site-packages/mock/mock.py line 1121 in _mock_call result = next(effect) /usr/local/lib/python2.7/site-packages/mock/mock.py line 109 in next return _next(obj) 放在测试的其他地方?或者我是否需要以某种方式在g.pickCard()方法中访问它?

1 个答案:

答案 0 :(得分:2)

mock.patch是可行的方法,但您应该指定return_value

而不是side_effect=(8, 10)
with mock.patch('lib.game.Game.pickCard') as mock_pick:
    mock_pick.side_effect = (8, 10)
    g = Game()
    print(g.pickCard())
    print(g.pickCard())

# 8
# 10

编辑#1

挑选卡仅用于演示挑选不同的牌。 在你的代码中,你选择两张牌,然后拨打game.deal,然后选择另外两张未被模拟的牌,引发StopIteration。此外,由于您的游戏对象已经存在(在setUp中创建),您应该直接修补此对象,而不是创建新的游戏对象,因此您的test_1应该是:

def test_1(self):
    """Player dealt winning card"""
    with mock.patch.object(self.game, 'pickCard') as mock_pick:
        mock_pick.side_effect = (8, 10)
        self.assertTrue(self.game.deal())

您使用MagicMock路径对象的属性pickCard,并将其副作用分别设置为8和10。