2016-12-22 8 views
1

pytestはmonkeypatchingドキュメントでは、この例があります:os.pathのmonkeypatchingにパス引数が必要なのはなぜですか?

import os.path 
def getssh(): # pseudo application code 
    return os.path.join(os.path.expanduser("~admin"), '.ssh') 

def test_mytest(monkeypatch): 
    def mockreturn(path): 
     return '/abc' 
    monkeypatch.setattr(os.path, 'expanduser', mockreturn) 
    x = getssh() 
    assert x == '/abc/.ssh' 

私はmockreturn関数からpath引数を削除すると、私はエラー

def getssh(): # pseudo application code 
>  return os.path.join(os.path.expanduser("~admin"), '.ssh') 
E  TypeError: mockreturn() takes 0 positional arguments but 1 was given 

を取得し、私はそれが位置提供しているものを理解していません引数?

また、pathlib.Path.home()で同じことを再実装すると、この引数を持つことができません。pathが存在します。それ以外の場合は動作しません。残念なことに、このドキュメントでは、その不吉なpath引数について何も言及していません。

ここでどのような魔法が起きているかは非常に参考になります。

答えて

1

1つの引数を引数に取るモックと、引数を取っても呼び出されたときにエラーになるような置き換えをしようとしています。あなたは、引数を取らない方法でexpanduserを交換しようとすると今

​​

:フードmonkeypatch.setattrの下 は、元のバージョンは、基本的には一つの引数を取るmock両方expanduserので、作品次の操作を行うとされたビルトインsetattrをそれほど使用していますあなたがエラーを取得しますと同じようにそれを呼び出しておいてください。あなたが直接mockを呼び出そうとしますが、まったく同じエラーを取得します

>>> setattr(os.path, 'expanduser', mock) 
>>> os.path.expanduser('~admin') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: mock() takes 0 positional arguments but 1 was given 

注:

>>> mock('~admin') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: mock() takes 0 positional arguments but 1 was given 
+0

ありがとう、私はちょうどクリックしていない/それは 'expanduser'はもちろんpathlib.Path.home()はそれなしで動作する一方、パスを提供する関数です。 –

関連する問題