2017-06-04 4 views
2

Ich habe einen Klickbefehl download genannt, die den Benutzer nach einem Benutzernamen und Passwort aufgefordert, bevor eine Reihe von Dateien herunterzuladen:Klicken: Ist es möglich, mehrere Eingaben an CliRunner.invoke zu übergeben?

$ python download.py 
Username: jkarimi91 
Password: 1234 
Download complete! 

Um zu testen, diesen Befehl, ich brauche beide ein username und ein password in der Lage sein Pass separat zu stdin. Die CliRunner.invoke() Methode hat ein input Argument, aber es akzeptiert keine Listen. Ist es möglich, mehrere Eingänge an CliRunner.invoke() zu übergeben?

+0

@StephenRauch, eine 'input' Argument keine' input' Methode. Siehe [Eingabe-Streams] (http://click.pocoo.org/5/testing/#input-streams) in der Klick-Dokumentation. – falsetru

+0

Mein Fehler, ich habe einen Tippfehler gemacht, aber seitdem korrigiert; input ist ein Argument für die Aufrufmethode von clirunner – jkarimi

Antwort

1

können mehrere Eingänge vorbei Zeichenfolge durch Neue-Zeile (\n) verbunden vorbei:

import click 
from click.testing import CliRunner 


def test_prompts(): 
    @click.command() 
    @click.option('--username', prompt=True) 
    @click.option('--password', prompt=True) 
    def test(username, password): 
     # download .. 
     click.echo('Download complete!') 

    # OR 
    # 
    # @click.command() 
    # def test(): 
    #  username = click.prompt('Username') 
    #  password = click.prompt('Password', hide_input=True) 
    #  # download .. 
    #  click.echo('Download complete!') 


    runner = CliRunner() 
    result = runner.invoke(test, input='username\npassword\n') # <--- 
    assert not result.exception 
    assert result.output.endswith('Download complete!\n') 


if __name__ == '__main__': 
    test_prompts() 
+0

wäre es möglich, wenn wir 'username' und' password' nicht als Argumente hinzufügen, sondern sie innerhalb von 'test()' mit 'raw_input()' und 'getpass abrufen. getpass() 'stattdessen? – jkarimi

+0

@jkarimi, Wenn Sie 'click.prompt()' verwenden, ist es möglich. Ich habe nicht mit 'raw_input()' oder 'getpass.getpass()' getestet. – falsetru

+1

@jkarimi, habe ich mit 'raw_input' getestet,' getpass.getpass'. Es funktioniert mit 'raw_input', aber nicht mit' getpass.getpass'. Sie sollten besser 'click.prompt ('Benutzername')' und 'click.prompt ('Passwort', hide_input = True)' für die Passworteingabe verwenden, was sehr gut mit 'runner.invoke (..., input = ..) ' – falsetru

Verwandte Themen