2013-05-13 19 views
5

Linuxで動作するいくつかのpythonコードがあります。これは、そのような方法で、PWDモジュールを使用しています。シャドーpython組み込みのpwdモジュール

import pwd 
    ... 
    def func(): 
     user=pwd.getpwnam(user)[2] 

は、今、私たちは、テストでこのコードをカバーするために、特定の必要性を持っている、とのテストはWindows上で実行可能でなければなりません。プログラム自体は、Linux上でのみ動作するように意図されています。問題は、pwdモジュールがWindowsでは使用できないため、pwd関数の実装がMagicMockを使用して実装されていても、テスト対象のコードがImportErrorで失敗することです。

この問題を解決するための基本的な考え方は、テスト実行時にpwdモジュールをシャドーすることでした。したがって、テストを実行すると、スタブはpwdをシャドウにし、メインプログラムを実行するときに、元の(Unix)pwdが使用されます。私たちは、テストPYTHONPATHでそのようなスタブを作成しました:

# pwd.py 
def getpwnam(user): 
    print("YESSSSSSSS") 

しかし、我々がビルトインPWDがインポートされていることがわかり、デバッガで、PWDモジュールをシャドウしていないようです。私は主にJava開発者ですので、やり方が「pythonic」でないとすみません。アイデアは大歓迎です。

答えて

9

pwd.pyの名前をwinpwd.pyなどの名前に変更します。次に使用:

try: 
    import pwd 
except ImportError: 
    import winpwd as pwd 

この方法をpwdインポートすることにより、取得する組み込みのLinux上pwd、およびWindows上winpwd。それで、あなたはテストを実行し、あなたが気に入ったようにそれを嘲笑することができるはずです。

+0

優れた答え、ちょうど私たちが必要なもの! – Dmitriusan

+0

winpwdのインストール方法は? pipには索引が付けられておらず、Google検索では奇妙なものが見つかります。 – syonip

+0

私はこの同じ問題を抱えています。 – Locane

4
import os 
if os.name == 'nt': 
    class Pwd(): 
     def getpwnam(self, user): 
      pass 
    pwd = Pwd() 
else: 
    import pwd 

何か類似の仕事はありますか?プロジェクト内に余分な.pyファイルは必要ありません。
私はfchownのためにそれを数回使っています...

+0

これは書かれているようには動作しません。すべてのメソッドは@classメソッドが装飾された関数でなければなりません。 –

+0

なぜこれは機能しませんか?私はちょうどあなたがinstanciateことができるクラスを作成しましたか?そこに、それを固定しましたか? – Torxed

+2

編集したコードは元のバージョンではなく動作します。 –

関連する問題