2

単体テストで使用するために、スペースを含む引数を適切な辞書オブジェクトに解析するように docopt を取得する際に問題が発生しています。

docopt が解析する引数リストを構築するために現在使用しているコードは次のとおりです。

testargs = []

def clear_args():
    testargs[:] = []
    return

def add_testfiles(file1='defaultfile1.txt', file2='defaultfile2.txt'):
    clear_args()
    testargs.append('--debug')
    testargs.append(file1)
    testargs.append(file2)
    return

def parse_args(optlist):
    argstr = ' '.join(optlist)
    return docopt(downpost.__doc__, argv=argstr)

私が単体テストを書いているコードには、次の引数が別々に与えられた 2 つのテストがあります。

-t <title>  # <title> can be any string (with spaces) inside quotation marks
"A Filename with Spaces.txt"  # any filename as long as it's in quotation marks

たとえば、-t 引数を追加するには、次のようにします。

def test_exampleunittest(self):
    add_testfiles()
    testargs.append('-t "This is the title I want"')
    self.args = parse_args(testargs)
    self.post = myPythonScript.process(self.args)
    self.assertEqual(self.post['Subject'], 'This is the title I want')

上記の引数を使用して単独でテストしているスクリプトを実行すると、それらは問題なく受け入れられ、出力は期待どおりになります。

ただし、スペースを含む引数を使用する単体テストを実行すると、次の結果が得られます。

DocoptExit: Usage: myPythonScript [options] <file_1> <file_2>

同じ dict オブジェクト (同じ引数を含む) を必要とする他の単体テストは正常に動作します。

docopt が通常どおりに引数を解析できるようにするには、コードの何を変更すればよいですか?

4

1 に答える 1

3

docopt はargv、パラメーターを文字列またはリストとして受け取ります。

  • リストの場合、リスト内の各項目を個別の引数として解釈します。
  • 文字列の場合、 を使用して文字列をリストに分割します.split()。このようにして、すべての空白を失います。

したがって、テストを機能させるには、リストを string に結合するのではなく、リストを渡す必要がありますargstr = ' '.join(testargs)

この混乱はおそらく、string を argv に渡すことが文書化されていないことが原因です。実際、これは API の一部ではなく、単なる実装の詳細です。docopt が文字列を取るという事実に頼るべきではありませんargv— これはなくなるかもしれません。ただし、docopt は常に のリストを受け入れargvます。

于 2013-07-24T21:17:15.383 に答える