2013-12-22 5 views
0

코드를 패치하지 않습니다

def test_get_network_info(self): 
    with open(dirname(abspath(__file__)) + '/files/fake_network_info.txt', 'r') as mock_network_info: 
     with patch('subprocess.check_output', Mock(return_value=mock_network_info.read())): 
      self.assertEqual('192.168.1.100', get_network_info()[0]) 
      self.assertEqual('255.255.255.0', get_network_info()[1]) 
      self.assertEqual('192.168.1.0', get_network_info()[2]) 

오류

====================================================================== 
ERROR: test_get_network_info (tests.test_tools.ToolsTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/tim/Documents/overseer/app/tests/test_tools.py", line 21, in test_get_network_info 
    with patch('subprocess.check_output', Mock(return_value=mock_network_info.read())): 
    File "/usr/local/lib/python2.7/dist-packages/mock.py", line 1268, in __enter__ 
    original, local = self.get_original() 
    File "/usr/local/lib/python2.7/dist-packages/mock.py", line 1242, in get_original 
    "%s does not have the attribute %r" % (target, name) 
AttributeError: <module 'subprocess' from '/usr/local/lib/python2.7/dist-packages/twill/other_packages/subprocess.pyc'> does not have the attribute 'check_output' 

이해가 무엇

문제의 나의 이해는 mocktwill을 조롱하려고하는 것입니다 'subprocess 파이썬 대신 모듈.파이썬 mock.patch 정확한 수입

질문

  1. 오전 내가 뭔가 잘못하고?

  2. 어떻게하면 파이썬 subprocess 모듈을 패치 할 것인지, 능 직물을 패치하지 않을 것인지 지정할 수 있습니까? (테스트 스위트에서 일찍 가져올 수 있음) **

  3. subprocess 모듈을 패치하는 다른 방법이 있습니까?

나는

내가 작동하지 않습니다

with patch('tools.subprocess.check_output', ...을 시도하려고 무엇.이

가 작동하지 않습니다

  • 내가 피곤 장식을 사용 ... 중 하나

    • i를 subprocess 모듈에 직접 패치 피곤 subprocess.check_output = Mock(...

    작품 만입니다 패치 적용을 취소하지 않기 때문에 좋지 않습니다. 능직의 서브 프로세스 모듈은 가져 오지있어 않기 때문에

    일부 더 많은 정보

    을 난 그냥이 테스트를 실행하는 경우와 다른 테스트, 그것은 작동합니다. 그러나 능 직물을 사용하여 테스트를 실행하는 즉시 위의 테스트는 실패합니다.

    Here은 이전 버전의 python에서 붙여 넣은 것처럼 보이는 능동태의 능직 버전입니다. 어떤 check_output 함수도 없으므로 테스트가 실패하는 것입니다.

    능 직물의 패키지는 광범위하게 사용하는 Flask-Testing 플러그인에서 제공됩니다. github here에 문제를 제출했습니다.

    누군가가 멋진 파이썬 커뮤니티에서 도움이되기를 바랍니다.:)

+0

능 직물의 출처를 확인한 다음 horror : sys.path.append (확장자) 및 기타 유사한 엉망. 실제로 경로를 변경하는 것이 기능의 일부인 경우를 제외하고는 모듈이 경로를 만져서는 안됩니다. 필자는 저자가 올바르게 처리하고 경로를 패치하는 방법을 찾지 못했고 이제는 충돌로 인해 문제가 발생하지 않는다고 생각합니다 (하위 프로세스를 제대로 사용할 수 없으며 모의 관련 문제가 아닙니다). 내가 github에서 본 것처럼 능 직물에서 멀리 이동하려고하면 5 년 이후로 업데이트되지 않았습니다. – vincent

답변

1

내 의견을 참조하십시오. 능 직물의 나쁜 습관으로 인해 적절한 방법은 능 직물을 수정하는 것이고, 어떤 작업이 필요할 수도 있고 다른 것으로 옮길 수도 있지만, 이제는 플라스크를 많이 사용하기 때문에 - 테스트, 값싼 움직임이 아닙니다.

이렇게하면 우리에게 더러운 속임수가 남습니다. 능직을 가져 오기 전에 어느 곳에서나 import subprocess을 확인하십시오. 내부적으로 이것은 subprocess 모듈에 대한 참조를 sys.modules에 추가합니다. 모듈이로드되면 import의 하위 시퀀스는 모두 sys.path에서 더 이상 보이지 않지만 이미 sys.modules에 캐시 된 참조 만 사용합니다.

불행히도 이것은 문제의 끝이 아닐 수도 있습니다. 분명히 능 직물은 어떤 이유로 든 하위 프로세스의 패치 버전을 사용합니다. 일반 내장 서브 프로세스가 대신로드되기 때문에 해당 패치를 사용할 수 없습니다. 예상치 못한 방식으로 충돌하거나 작동 할 가능성이 매우 높습니다. 그렇다면 위의 제안으로 돌아가십시오.