2016-11-04 21 views
0

reprの例外を返すコードがあります。それは次のようにコードの非常に易しく書き直さダウンバージョンであるPythonの2とPython 3Python 2&3互換のUnicode文字列アサート同値

上で実行する必要がある:

from __future__ import unicode_literals 

class Foo: 
    def bar(self): 
     return repr(Exception('bar')) 

問題は、上記のコードをテストです。

のPython 3.5:

foo = Foo() 
assert foo.bar() == "Exception('bar',)" 
# true 

のPython 2.7:

foo = Foo() 
assert foo.bar() == "Exception('bar',)" 
# false because foo.bar() returns "Exception(u'bar',)", 
# note the ``u`` before the first ``'`` 

二つの文字列の平等を主張するときにuを無視するエレガントな方法はありますか?私はunittest2を使用しています。

+0

'str'に' bar'を型キャストしますか?すなわち 'str( 'bar')' –

+0

Pythonのバージョンが動いているかどうかによって、期待される結果をちょうど定義する必要があるようです。 – user2357112

+0

これは私が今持っているものです。しかし、複数行の文字列と多くのテストでは、これは重複が多いことを意味するので、私はより良い解決策を模索しています。 – zupo

答えて

1

文字列の同等性を「変更」する簡単な方法はありません。近似マッチングを行う方法はありますが、それはあなたが望まない他の変更を可能にするかもしれません。

問題を解決する最良の方法は、assertの条件を定義する方法を単純に変更することです。次の選択肢が両方python2 &のpython3で動作するはずです:

  • あなたが動的に期待する例外を作成します。

    assert foo.bar() == repr(Exception(u'bar')) 
    
  • 使用inをし、両方の選択肢をチェック:

    assert foo.bar() in ("Exception('bar',)", "Exception(u'bar',)") 
    

後者は、u'bar'でも、Python2では、あなたの要件に応じて、大丈夫かどうかは分かりません。

関連する問題