私は、文字列のリストから文字列をランダムに選択するクラスメソッドに対してpytestを使ってテストを開発しようとしています。それは基本的に以下のgivemeanumber方法のように見えますpytestでmonkeypatchingを働かせること
:
第一の方法、getsshは、クラスでボブがpytest docs
からわずか一例である私の生産コードはから文字列のリストを取得しDBを選択してランダムに選択します。だから私は私のテスト文字列を取得し、ランダムに選択する代わりに、最初の文字列を選択したいと思います。そうすれば、私は既知の文字列に対してテストすることができます。
私の読書から、私はランダム化を偽造するためにモンキーパッチを使用する必要があると思う。ここで
は、私がこれまで持っているものだ
import os.path
from random import choice
from _pytest.monkeypatch import MonkeyPatch
from bob import Bob
class Testbob(object):
monkeypatch = MonkeyPatch()
def test_getssh(self):
def mockreturn(path):
return '/abc'
Testbob.monkeypatch.setattr(os.path, 'expanduser', mockreturn)
x = Bob.getssh()
assert x == '/abc/.ssh'
def test_givemeanumber(self):
Testbob.monkeypatch.setattr('random.choice', lambda x: x[0])
z = Bob.givemeanumber()
assert z == 1
最初の試験方法は、再びpytestドキュメント(私はテストクラスでそれを使用していて、わずかに適応)の例です。これは正常に動作します。
私は Testbob.monkeypatch.setattr(random, 'choice', lambda x: x[0])
を使用することを期待するドキュメントからの例に従うが、これは私が Testbob.monkeypatch.setattr('random.choice', lambda x: x[0])
に変更した場合、それはさらに取得しますが、何のスワップアウトが発生していない NameError: name 'random' is not defined
が得られます。 AssertionError: assert 2 == 1
ジョブの正しいツールをmonkeypatchingしていますか? どこが間違っているのですか?
それは 'os.path'のために行われているようにあなたは、monkeypatching前に'輸入random'を試してみましたか? –
'import random.choice'を' from random import choice'の代わりに使用し、それに応じてコードを調整してください。しかし、私はむしろ依存性注入を使い、猿のパッチを避けるでしょう。 – Goyo
この構文はモジュールのためのものであり、 'choice'は関数であるため、' random.choice'をインポートすることはできません。それはちょうど失敗するでしょう。 –