2014-03-17 6 views
2

я написал такой код:Python инъекционного случайное число в тестах

def choice(states): 
    states = list(states) 
    rnd = random.random() 
    for state, p in states: 
     rnd -= p 
     if rnd <= 0: 
      return state 

И мне нужно создать несколько тестов:

import unittest 
class Tests(unittest.TestCase): 
    def test_choice(self): 
     assertEquals(choice(states),something_equl) 

Как я должен вводить свой собственный случайное число в тесте ? получить детерминированные результаты?

+0

Что именно вы пытаетесь сделать? –

+0

, вы могли бы иметь 'rnd', но не выполняли' None'. Тогда в вашей функции генерируется только 'rnd', если это' None'. – cmd

+0

Когда вы вызываете свою функцию, вы можете сделать что-то вроде этого random.randrange (0000,9999) –

ответ

4

Mock в random.random() функции, например:

import random 
import unittest 
import mock 


def choice(states): 
    states = list(states) 
    rnd = random.random() 
    for state, p in states: 
     rnd -= p 
     if rnd <= 0: 
      return state 


class Tests(unittest.TestCase): 
    @mock.patch('random.random') 
    def test_first_state_fires(self, random_call): 
     random_call.return_value = 1 
     self.assertEquals(choice([(1, 1)]), 1) 

    @mock.patch('random.random') 
    def test_returns_none(self, random_call): 
     random_call.return_value = 2 
     self.assertIsNone(choice([(1, 1)])) 
3

Вы можете использовать unittest.mock library для исправления функции random(). Библиотека является частью Python 3.3 и выше, вы можете установить его отдельно, как mock для более старых версий:

try: 
    from unittest import mock 
except ImportError: 
    import mock 

class Tests(unittest.TestCase): 
    @mock.patch('random.random') 
    def test_choice(self, mock_random): 
     mock_random.return_value = 0.42 
     assertEquals(choice(states),something_equl) 
Смежные вопросы