2016-02-12 2 views
1

Im практикующий с модульным тестированием и носовыми испытаниями из простой игры, и у меня есть раздел игры, в котором есть кубики с random.randint, которые мне нужно проверить. Я следовал этой статье о том, как проверить случайные события с притворнымСлучайный не работает с mock in nosetest

http://www.jjinux.com/2014/01/python-lightning-quick-introduction-to.html

Im получаю эту ошибку, когда я бегу nosetests хотя

ERROR: tests.ex47_tests.test_dice_roll 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/site-packages/nose/case.py", line 197, in runTest 
    self.test(*self.arg) 
    File "/usr/local/lib/python2.7/site-packages/mock/mock.py", line 1297, in patched 
    arg = patching.__enter__() 
    File "/usr/local/lib/python2.7/site-packages/mock/mock.py", line 1353, in __enter__ 
    self.target = self.getter() 
    File "/usr/local/lib/python2.7/site-packages/mock/mock.py", line 1520, in <lambda> 
    getter = lambda: _importer(target) 
    File "/usr/local/lib/python2.7/site-packages/mock/mock.py", line 1210, in _importer 
    thing = _dot_lookup(thing, comp, import_path) 
    File "/usr/local/lib/python2.7/site-packages/mock/mock.py", line 1199, in _dot_lookup 
    __import__(import_path) 
ImportError: No module named random 

Я импортированные случайным поэтому не уверен, почему это ISN» t работает или это что-то связано с макетом?

Вот часть кода из файла файл игры и тесты (Ive не ставить весь код здесь, как я не думаю, что нужно)

game.py

class Intro(Rooms): 

def enter(self): 
    print "Intro room" 

    print "You see the Gothon, you have to fight him!" 

def dice_roll_fight(self): 
    print 'DICE ROLL' 

    dice_roll = randint(1,6) 
    print "You rolled a ", dice_roll 
    if dice_roll <= 2: 
     return 'death' 

    elif dice_roll >= 3: 
     return 'starter' 

    else: 

     print "ERROR try again" 

ex47_tests.py

from nose.tools import * 
from ex47.game import Intro 
from mock import mock 
import random 


@mock.patch('ex47.game.random.randint') 
def test_dice_roll(randint_mock): 
randint_mock.return_value = 1 
assert_equal(game.dice_roll_fight(), 'death') 


@mock.patch('ex47.game.random.randint') 
def test_dice_roll(randint_mock): 
randint_mock.return_value = 2 
assert_equal(game.dice_roll_fight(), 'death') 

@mock.patch('ex47.game.random.randint') 
def test_dice_roll(randint_mock): 
randint_mock.return_value = 3 
assert_equal(game.dice_roll_fight(), 'starter') 
+0

Не могли бы вы показать оператор импорта для '' random' в game.py'? – Oleksiy

ответ

2

Основываясь на том, как звонить rand_int в вашем классе Intro, вы, вероятно, импортируете этот путь:

from random import randint 

В этом случае ваше исправление должно быть таким:

@mock.patch('ex47.game.randint') 

То, как вы заплаты:

@mock.patch('ex47.game.random.randint') 

Указует, что вы импортируете как это:

import random 

Кроме того, я вижу несколько проблем в вашем тестовом коде.

  1. Вы производите импорт в своих тестах. Вам не нужно это делать. Вы исправляете исправления (исправления в отношении того, что вы тестируете), поэтому вам не нужно импортировать случайные данные, так как вы будете правильно исправлять ваш случайный метод в отношении вашего модуля game.

  2. Похоже, вы пытаетесь вызвать свои методы, не создавая экземпляр своего класса. Если вы еще не сделали, вы должны настроить ваш тест как:

    class ThisIsMyTest(unittest.TestCase): def setUp(self): self.game = Intro()

  3. Ваши методы испытаний все одинаковые имена. Это закончится тем, что будет выполняться только один тест, и вы не будете получать другие результаты, которые хотите проверить.

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

import unittest 
from nose.tools import assert_equal 
from game import Intro 
from mock import mock 


class GameTest(unittest.TestCase): 

    def setUp(self): 
     self.game = Intro() 

    @mock.patch('game.randint') 
    def test_dice_roll_one(self, randint_mock): 
     randint_mock.return_value = 1 
     from nose.tools import assert_equal 
     assert_equal(self.game.dice_roll_fight(), 'death') 

    @mock.patch('game.randint') 
    def test_dice_roll_two(self, randint_mock): 
     randint_mock.return_value = 2 
     assert_equal(self.game.dice_roll_fight(), 'death') 

    @mock.patch('game.randint') 
    def test_dice_roll_three(self, randint_mock): 
     randint_mock.return_value = 3 
     assert_equal(self.game.dice_roll_fight(), 'starter') 


if __name__ == '__main__': 
    unittest.main() 
+1

спасибо за всесторонний ответ! –

Смежные вопросы