나는 문자열 목록에서 임의로 문자열을 선택하는 클래스 메소드에 대해 pytest를 사용하여 테스트를 개발하려고합니다.pytest에서 작동하는 monkeypatching 받기
그것은 아래 givemeanumber 방법과 같은 본질적으로 같습니다
import os.path
from random import choice
class Bob(object):
def getssh():
return os.path.join(os.path.expanduser("~admin"), '.ssh')
def givemeanumber():
nos = [1, 2, 3, 4]
chosen = choice(nos)
return chosen
첫 번째 방법, getssh은 수업 시간에 밥은 내 생산 코드에서 문자열 목록을 페치 pytest docs
에서 그냥 예입니다 DB를 선택한 다음 임의로 하나를 선택합니다. 그래서 내 테스트 문자열을 가져오고 무작위로 선택하는 대신 첫 번째 문자열을 선택합니다. 그렇게하면 알려진 문자열에 대해 테스트 할 수 있습니다.
내 독서에서 나는 무작위 배치를 위조하기 위해 monkeypatching을 사용해야한다고 생각합니다.
는 여기에 지금까지
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하기 전에'import random'을 시도해 보셨습니까? –
'from random import choice' 대신'import random.choice'를 사용하고 이에 따라 코드를 조정하십시오. 하지만 나는 의존성 주입을 사용하고 원숭이 패치를 피하고 싶습니다. – Goyo
이 구문은 모듈만을위한 것이므로'random.choice'를 임포트 할 수 없습니다.'choice'는 함수입니다. 그것은 단지 실패 할 것이다. –