2017-06-04 115 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

相關問題