2016-05-20 15 views
4

私はPython 2.7を使ってゲームを作成しています。私は私のメインファイル内のメソッドをチェックするためにテストスクリプトを使用したいが、私はわずかな問題に走っている。Python 2.7 - テストスクリプトがraw_inputをシミュレートします

メインスクリプトでは、ユーザーがraw_input()を使用してゲームをプレイするかどうかを尋ねます。残念ながら、これは、Windows PowerShellを使用してテストスクリプトを実行すると、コンソールからユーザーに入力が求められ、手動で回答を入力する必要があることを意味します。繰り返しテストを行うと、手入力が面倒になっています。

(MWEと出力:ここでは、テストスクリプトはメソッドをチェックするだけであり、ゲームプレイ自体ではないため 'n'を生成する必要があります)実際のメソッドは計算を行い、文を出力し、 )

これは私の質問に私をもたらします: 自動的raw_input()のための入力を生成するテストスクリプトを書くためのいくつかの方法はありますか? 代わりに、テストスクリプトがシミュレートできるメインゲームファイルのユーザー入力を受け入れる他の方法がありますか?

思考:答えを探している間は、私は約mock ...私はその前に使用していないいくつかの情報を見てきたともモックは、特定のステートメントからの結果を主張するようだが、ちょうど私テストファイルが効果的にそのプロンプトをバイパスするようにします。 ...

MWE.py(ゲームファイル)

def game_method(stuff): 
    """Calculates stuff for game""" 
    stuff_out = 'foo' 
    return stuff_out 

""" Check user wants to play the game """ 
startCheck = raw_input('Would you like to play the game? (y/n) > ') 
if (startCheck.lower() == 'y'): 
    play = True 
else: 
    play = False 

""" Set up a game to play""" 
while (play==True): 
    # Do stuff 
    stuff_out = game_method(stuff) 
else: 
    print "\n\tGoodbye.\n\n" 

MWE-テストを私はただのゲームスクリプトからその(Y/N)プロンプトを削除することもできますが、これは良い学習機会のように思えます。 PY(テストスクリプト)

import MWE 

def check_game(input): 
    string_out = MWE.game_method(input) 
    return string_out 

""" Test code here """ 
input = 7 
string_output = check_game(input) 
print "===============\n%s\n===============\n\n\n" % (string_output == 'foo') 

コンソール出力は:

PS C:\dir> python MWE-test.py 
Would you like to play the game? (y/n) > n 

     Goodbye. 


===True=== 

PS C:\dir> 
+0

私にはわからないテスト・スクリプトからのテスト・スクリプトからの引数を持つ

  • 打ち上げゲームスクリプトを渡しシンタWindowsではxですが、入力リダイレクトを調べます。あなたは、ファイルから入力を受け取り、そこにコマンドを持つようにプログラムに指示します。 – JETM

  • +0

    [StringIO](https://docs.python.org/2.7/library/stringio.html)オブジェクトを作成し、 'sys.stdio'をそれに置き換えることを検討してください。 –

    +0

    @AustinHastings私はStringIOのアイデアが初めてです。それは、入力を引っ張ったり、出力をファイルに書き込んだりするように思えます。しかし、そこから引き抜く方法はわかりません。代わりに 'raw_input()'をStringIOに再定義する必要がありますか?どこでそれを定義しますか?それはメインファイルかテストファイルの中に入りますか?私はゲームファイルをそのままの状態にしておくことを望んでいます。あるいは、一般的にどんなマシンでも動作するように、ゲームファイルを変更したいと考えています。思考?もっと情報を私に提供してもらえますか? – user2441511

    答えて

    0

    私はこれに興味があったので、いくつかは、を探していましたリダイレクト。 raw_inputが呼び出されたスクリプト内で使用オースティンHashings提案作品は:

    import sys 
    import StringIO 
    
    def game_method(stuff): 
        """Calculates stuff for game""" 
        stuff_out = 'foo' 
        return stuff_out 
    
    # Specity your 'raw_input' input 
    s = StringIO.StringIO("n") 
    sys.stdin = s 
    
    """ Check user wants to play the game """ 
    startCheck = raw_input('Would you like to play the game? (y/n) > ') 
    
    sys.stdin = sys.__stdin__ 
    
    if (startCheck.lower() == 'y'): 
        play = True 
    else: 
        play = False 
    
    """ Set up a game to play""" 
    while (play==True): 
        # Do stuff 
        stuff_out = game_method(stuff) 
    else: 
        print "\n\tGoodbye.\n\n" 
    

    残念ながら、これはスクリプトの外で動作するようには思えません。 This questionは問題を見ていて、一般的なコンセンサスでは、raw_inputを言語機能としてテストに含める必要はないので、他のいくつかの方法を使用して入力を渡して、raw_inputと似ていますよう:

    • は、あなたのゲーム機能への追加入力を追加し、
    0
    import MWE 
    
    def check_game(input): 
        string_out = MWE.game_method(input) 
        return string_out 
    
    """ Test code here """ 
    input = 7 
    
    old_sysin = sys.stdin 
    server_input = cStringIO.StringIO("y" + "\n") 
    sys.stdin = server_input 
    
    string_output = check_game(input) 
    print "===============\n%s\n===============\n\n\n" % (string_output 
    == 'foo') 
    
    +0

    説明が少し役立つかもしれません。 – GhostCat

    関連する問題