2017-06-04 128 views
2

我有一个名为download点击命令,下载一系列文件之前提示输入用户名和密码的用户:Click:是否可以将多个输入传递给CliRunner.invoke?

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

为了测试这个命令,我需要能够同时传递一个usernamepassword ,单独到stdinCliRunner.invoke()方法有一个input参数,但它不接受列表。是否可以将多个输入传递给CliRunner.invoke()

+0

@StephenRauch,一个'input'参数,而不是一个'input'方法。在单击文档中查看[Input Streams](http://click.pocoo.org/5/testing/#input-streams)。 – falsetru

+0

我的错误,我犯了一个错误,但自此纠正; input是clirunner的调用方法的一个参数 – jkarimi

回答

1

只要通过由换行(\n)加入字符串传递多个输入:

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

如果我们没有添加'username'和'password'作为参数,而是使用'raw_input()'和'getpass在'test()'里面检索它们, getpass()'而不是? – jkarimi

+0

@jkarimi,如果你使用'click.prompt()',这是可能的。我没有用'raw_input()'或'getpass.getpass()'测试。 – falsetru

+1

@jkarimi,我用'raw_input','getpass.getpass'测试过。它适用于'raw_input',但不适用'getpass.getpass'。你最好使用''click.prompt('用户名')和'click.prompt('Password',hide_input = True)'输入密码,这与'runner.invoke(...,input = ..)' – falsetru

相关问题