2014-07-25 2 views
1

장고를 조롱하는 것에 대해 배우고 있지만 패치 할 때 머리가 아프지는 않습니다. 장고의 패치 꾸미기로 모듈을 조롱 할 때 오류가 발생했습니다.

test_get_name 패스

하지만 여기

ValueError: Object is of type 'MagicMock', but must be a Django Model, Manager, or QuerySet와 test_patched_get_name 실패는 내 파일입니다

utils.py

def get_name(clientid): 
    c = get_object_or_404(Client, pk=clientid) 
    c_name = c.get_name() 
    return c_name 

tests.py

class ClientTests(unittest.TestCase): 
    def setUp(self): 
     self.c_instance = mock.Mock(spec=Client, pk=1) 
     self.c_instance.name = "Test" 

    def test_get_name(self): 
     self.assertEqual(Client.get_name(self.c_instance), "Test") 

    def test_patched_get_name(self): 
     with mock.patch('myapp.utils.Client') as self.c_instance: 
      from myapp.utils import get_name 
      self.assertEqual(get_name(self.c_instance.pk), "Test") 

models.py는

class Client(models.Model): 
    name = models.CharField(max_length=200) 

    def get_name(self): 
     return self.name 

나는 get_object_or_404이 모델보다는 모의 객체를 원하지만 나는이 작업을 수행하는 방법을 잘 모르겠습니다 가정합니다.

전체 역 추적 :

====================================================================== 
ERROR: test_patched_get_name (myapp.tests.ClientTests) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "pathto/myapp/tests.py", line 63, in test_patched_get_name 
    self.assertEqual(get_name(self.c_instance.pk) 
    File "pathto/myapp/views.py", line 36, in get_name 
    cu = get_object_or_404(Client, pk=clientid) 
    File "pathto/lib/python2.7/site-packages/django/shortcuts/__init__.py", line 111, in get_object_or_404 
    queryset = _get_queryset(klass) 
    File "pathto/lib/python2.7/site-packages/django/shortcuts/__init__.py", line 97, in _get_queryset 
    "Manager, or QuerySet" % klass__name) 
ValueError: Object is of type 'MagicMock', but must be a Django Model, Manager, or QuerySet 

---------------------------------------------------------------------- 
+0

당신이 전체 역 추적을 제공하십시오 것입니다

나는 테스트는 다음과 같이 보일한다고 생각? – Nilesh

+0

추적으로 업데이트했습니다. – greenafrican

+0

'class Client (models.Model) :'이것은'models.Model'에서'Client' 확장을 보여줍니다. 유청이 'MagicMock'을 보여 주나요? – Nilesh

답변

0

당신이 get_name 기능을 테스트하려는 경우, 당신이 장고의이 get_object_or_404 대신 패치한다고 생각합니다. 그것이 의미하는 것은 테스트가 get_name을 호출 할 때 Django의 을 get_object_or_404으로 호출하는 대신 코드가 mock 객체 (패치 된 함수)를 호출하여 예측할 수있는 값을 반환한다는 것입니다. 그러면 테스트는 get_name이 작동하고 올바른 값을 반환하는지 확인하는 것입니다. Django의 get_object_or_404에 대한 실제 호출을 수행 할 필요가 없습니다 (테스트 대상이 아니기 때문에).

# make sure you import "patch" from mock 
from mock import patch 

# Patch the "get_object_or_404" function used inside "get_name" 
@patch('myapp.utils.get_object_or_404') 
def test_patched_get_name(self, mock_get_object_or_404): 

    # The patched function is supplied as a parameter to your test function 
    # -- you can give it any name you want (in this case, it's 
    # "mock_get_object_or_404"). 

    from myapp.utils import get_name 

    # Set mock function's return value -- the patched function here 
    # will return the mock "Client" object. 
    mock_get_object_or_404.return_value = self.c_instance 

    # Now compare the return value from the "get_name" function to 
    # see if it's the same as the dummy client's name. 
    returned_value = get_name(self.c_instance.pk) 
    expected_value = self.c_instance.name 
    self.assertEqual(returned_value, expected_value) 
+0

다음 오류 받기 : 'AssertionError : <모의 이름 = "mock.client.get_name()"id = "3244477493">! = "테스트"' – greenafrican

+0

모의가 모델을 기반으로 클래스 인스턴스를 만드는 방법을 잘 모르겠습니다. defintion,하지만 당신은 귀하의 모의 개체에서 Client 클래스의 "get_name"메서드에 대한 반환 값을 지정해야한다고 생각합니다. 테스트 케이스 setUp에 다음을 추가하십시오. self.c_instance.get_name.return_value = self.c_instance.name. – kchan

관련 문제