2015-07-21 84 views
0

嗨我是新的单元测试,想知道如何测试一个函数,它有一个随机组件?nosetest一个随机元素的函数

我有以下Python代码:

class Questions(object): 

def __init__(self): 

    self.questions = {} 

place_value = { 
    0: "Thousands", 
    1: "Hundreads", 
    2: "Tens", 
    3: "Units/ones", 
} 

def place_value(self, question, number): 

    selection = randint(0, 3) 

    number = ''.join(map(str, number)) 
    value = number[selection] 

    question_text = question.format(value, number) 

    li = generate_a_list(question_text) 

    self.questions['question1'] = li 

测试代码

def test_place_value(): 

    obj = math_q.Questions() 
    obj.place_value("value of {0} in {1}", [1,2,3,4]) 

    assert_equal(obj.questions["question1"], ["value of {0} in 1234"]) 

的问题是不知道哪个值1-4从“值=数选择了[选择]'的代码。

可以做些什么呢? 谢谢。

+2

模拟'randint'总是返回相同的结果并编写4个测试来处理所有4种可能性。 – freakish

回答

0

假设你的代码是path/my_file.py你可以使用模拟模块是这样的:

@mock.patch('path.my_file.randint', return_value=0) 
def test_place_value(m_randint): 
    obj = math_q.Questions() 
    obj.place_value("value of {0} in {1}", [1,2,3,4]) 

    m_randint.assert_called_once_with(0, 3) 
    assert obj.questions["question1"] == ... 

然后只写4个测试来处理所有案件。

附注:我强烈建议切换到pytest。

+0

感谢您的回复。四个测试处理所有情况是什么意思?这些测试代码的样子是什么? – user1831677

+0

只需将4个测试函数的'return_value'改为'0,1,2,3'。 – freakish

+0

伟大的工作,但一个简单的问题。如果我必须从100的范围内选择,该怎么办?我是否必须编写100个单独的函数才能测试该函数?当然必须有一个更简单的方法。 – user1831677