亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python 3 - 具有多個輸入的單元測試和使用模擬的打印語句

Python 3 - 具有多個輸入的單元測試和使用模擬的打印語句

慕無忌1623718 2022-10-18 17:34:36
我正在研究 Python,幾周前我創建了一個游戲,用戶需要猜測用戶自己定義的間隔之間的數字?,F在我正在學習 Unittest,我決定為游戲編寫一個測試模塊。然而,由于它需要來自用戶的 4 個輸入(其中兩個定義了將生成隨機數的范圍,一個是用戶的猜測,最后一個是一個 Y/N 問題,供用戶決定他是否想要繼續。import randomdef main():    print('Welcome to the guess game!')    while True:        try:            low_param = int(input('Please enter the lower number: '))            high_param = int(input('Please enter the higher number: '))             if high_param <= low_param:                print('No, first the lower number, then the higher number!')            else:                break        except:            print('You need to enter a number!')    while True:        try:            result = random.randint(low_param, high_param)            guess = int(input(f'Please enter a number between {low_param} and {high_param}: '))            if low_param <= guess <= high_param:                if result == guess:                    print('Nice, dude!')                    break                else:                    print ('Not yet, chap')                while True:                    try_again = input('Would you like to try again? (Y/N) ')                    if try_again.lower() == 'n':                        break                    elif try_again.lower() == 'y':                        print('If you consider yourself capable...')                        break                    else:                        pass                if try_again.lower() == 'n':                    print('Ok, maybe next time, pal :v')                    break                            else:                print(f'Your guess must be between {low_param} and {high_param}')        except:            print('Are you sure you entered a number?')if __name__ == '__main__':    main()在測試中,我想創建一些方法來驗證以下情況:1 - low_param 或 high_param 不是數字 2 - low_param 高于 high_param 3 - 猜測高于 high_param 4 - 猜測低于 low_param 5 - 猜測是字符串 6 - try_again 既不是 Y 也不是 N我設法在第一種方法上模擬了一個輸入,但是我不知道如何將 print 語句斷言為情況輸出。對于其他情況,我需要模擬多個輸入,然后我就卡住了。我該如何解決這兩個問題?
查看完整描述

1 回答

?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

你的第一個問題是跳出循環。print您可以通過向引發異常的模擬函數添加副作用來做到這一點,并在測試中忽略該異常。mockedprint也可用于檢查打印的消息:


@patch('randomgame.print')

@patch('randomgame.input', create=True)

def test_params_input_1(self, mock_input, mock_print):

    mock_input.side_effect = ['foo']

    mock_print.side_effect = [None, Exception("Break the loop")]

    with self.assertRaises(Exception):

        main()

    mock_print.assert_called_with('You need to enter a number!')

請注意,您必須將副作用添加到第二個 print調用,因為第一個調用用于發出歡迎消息。


第二個測試的工作方式完全相同(如果以相同的方式編寫),但有一個問題:在您的代碼中,您捕獲的是通用異常而不是特定異常,因此您的“中斷”異常也將被捕獲。這通常是不好的做法,因此與其解決此問題,不如捕獲轉換int失敗時引發的特定異常:


while True:

    try:

        low_param = int(input('Please enter the lower number: '))

        high_param = int(input('Please enter the higher number: '))

        if high_param <= low_param:

            print('No, first the lower number, then the higher number!')

        else:

            break

    except ValueError:  # catch a specific exception

        print('You need to enter a number!')

代碼中的第二個try/catch塊也是如此。


查看完整回答
反對 回復 2022-10-18
  • 1 回答
  • 0 關注
  • 105 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號