2013-08-29 4 views
0

두 개의 모듈이있다.django 형태의 함수를 조롱하다

a.py

def get_resource(arg1, arg2): 
    return Modelobject based on arg1 and arg2 or None 

b.py (양식)

from a import get_resource 
class A(forms.Form): 
arg1 = forms.CharField() 
arg2 = forms.CharField() 
def clean(self): 
    res = get_resource(arg1, arg2) 
    if res is None: 
    validationerror 
    else: 
    cleaned_data.update(res_key=res) 

내가 어떤 데이터베이스를 필요로이 donot하지만 난 그게 작동시킬 수 couldnot 그래서 지금은 get_resource 부분을 조롱 할 필요가있다.

여기 내가 시도했지만, 작동하지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까 ? 나는 모의 테스트에서 아주 초보자입니다 때문에

class Test(TestCase): 
    def test_form_a(self): 
    with patch('b.get_resource') as mock_tool: 
     mock_tool.return_value = MagicMock(spec=MusicModel) 
     form_data = {'arg1': '1', 'arg2': 'Music'} 
     form = A(data=form_data) 

또한 나는 누구도 날 올바른 방향으로 보여줄 수있는 기능

def my_side_effect(*args, **kwargs): 
    return value based on arg[0] and arg[1] 

mock_tool.side_effect = my_side_effect 

와 side_effects를 시도?

+0

왜, 특히 데이터베이스를 필요로하지 않도록 조롱하고 싶습니까? "순수한"단위 테스트에서 그렇다는 것을 알고 있지만 Django의 단위 테스트 환경에는 테스트 DB를 정확하게 설정하여 이런 종류의 것에 대해 걱정할 필요가 없습니다. –

+0

글쎄, 난 그냥 테스트 및 물건 시작. 그리고 나는 폼의 깨끗한 메소드를 오버라이드하고 싶기 때문에, 나는 데이터베이스를 건드리지 않고 그것을 끝낼 수 있는지보고 싶다. 나는 데이터베이스를 만지고 비품을 만들면 unittest가 아닐 것이라고 생각합니다. – sagarchalise

답변

0

업데이트 : 문제가 무엇인지 알아 냈습니다. 왜 이런 일이 일어나는지를 이해하는 데 어려움이 있지만 수입에 따라 다릅니다.

class Test(TestCase): 
    def test_form_a(self): 
    with patch('b.get_resource') as mock_tool: 
     from b import A 
     form_data = {'arg1': '1', 'arg2': 'Music'} 
     form = A(data=form_data) 
     mock_tool.return_value = MagicMock(spec=MusicModel) 

나는 그것의 모든 때문에 모듈로드를 추측 : 내가 그렇게 형태를 인스턴스화 한 후에 분명히, 나는 패치 내부 폼 클래스를 가져오고 반환 값을 정의해야합니다.

0

저는 장고 양식에 익숙하지 않으므로 기본적으로 스크립트를 올바른 방법으로 수정했습니다. 테스트가 모두 통과 된 것 같습니다. 문제의 원인 코드를 생략했을 수 있습니다. 그러나 다음은 참조 용 작업 예제입니다.

퍼센트의 nosetests는 ... test_no_patch_a (test.Test) ... 확인 test_patch_a (test.Test)를 확인 test.py

a.py

def get_resource(arg1, arg2): 
return arg1 

b.py

from a import get_resource 
class A(object): 
arg1 = 'arg1' 
arg2 = 'arg2' 
res = None 
def __init__(self, data): 
    self.res = get_resource(data['arg1'], data['arg2']) 

def bow(self): 
    if self.res is None: 
    return 'validationerror' 
    else: 
    return self.res 

test.py

import unittest 
from mock import patch 
from b import A 

class Test(unittest.TestCase): 
    def test_patch_a(self): 
    with patch('b.get_resource') as mock_tool: 
     mock_tool.return_value = 'patched' 
     data = {'arg1': '1', 'arg2': 'Music'} 
     form = A(data=data) 
     self.assertEqual('patched', form.bow()) 

    def test_no_patch_a(self): 
    data = {'arg1': '1', 'arg2': 'Music'} 
    form = A(data=data) 
    self.assertEqual('1', form.bow())