如何在pickCard()
函数中存根被调用两次的deal()
函数的输出?我想测试失败和获胜案件
例如,我希望获胜的情况下,第一次pickCard()
被调用的值为8
到card1
,第二次给定值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()
方法中访问它?
答案 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。