2015-07-21 58 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