2012-10-14 3 views
10

은 내가 Djangos model.Manager() 클래스에 체인 전화를 조롱하려합니다. 지금은 values()filter() 방법을 조롱하고 싶습니다. 장고 ORM -. 모의 값() 필터() 체인

내가 조금 테스트 프로젝트 만든 테스트하려면 :

  1. 가상 환경
  2. 실행 pip install django mock mock-django nose django-nose
  3. 응용 프로그램을 만들기 manage.py startapp mockme
  4. 추가 프로젝트 django-admin.py startproject mocktest
  5. 만들기 만들기를 django_nosemocktest.mockme ~ INSTALLED_APPS (settings.py)
  6. TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'

그 모든 것을 verfiy하기 settings.py를 추가 올바르게 설정되어 나는 manage.py test을 달렸다. Django는 앱을 만들 때 하나의 테스트를 실행합니다. 내가 한

다음 것은 매우 간단한 모델을 만드는 것이 었습니다.

mockme/models.py은 내가 한

from django.db import models 

class MyModel(models.Model): 
    name = models.CharField(max_length=50) 

다음 것은 MyModel를 사용하는 간단한 함수를 작성하는 것이 었습니다. 그것이 나중에 테스트하고 싶은 기능입니다.

mockme/functions.py 특별

from models import MyModel 

def chained_query(): 
    return MyModel.objects.values('name').filter(name='Frank') 

아무것도 여기에서 일어나고있다. 이 함수는 MyModel 객체를 필터링하여 name='Frank' 인 모든 인스턴스를 찾습니다. values ​​()를 호출하면 찾을 수있는 모든 MyModel 인스턴스의 이름 필드 만 포함되는 ValuesQuerySet을 반환합니다.

mockme/tests.py

import mock 

from django.test import TestCase 
from mocktest.mockme.models import MyModel 
from mocktest.mockme.functions import chained_query 
from mock_django.query import QuerySetMock 

class SimpleTest(TestCase): 
    def test_chained_query(self): 
     # without mocked queryset the result should be 0 
     result = chained_query() 
     self.assertEquals(result.count(), 0) 

     # now try to mock values().filter() and reeturn 
     # one 'Frank'. 
     qsm = QuerySetMock(MyModel, MyModel(name='Frank')) 
     with mock.patch('django.db.models.Manager.filter', qsm): 
      result = chained_query() 
      self.assertEquals(result.count(), 1) 

첫 번째 assertEquals은 성공적으로 평가합니다. 모델 관리자가 조롱되지 않았으므로 인스턴스가 반환되지 않습니다. 나는 그것이 마지막으로 평가 될 것이다 발견 이후

qsm = QuerySetMock(MyModel, MyModel(name='Frank')) 

나는 filter() 방법이 아닌 values() 방법을 조롱 : 두 번째 assertEquals가 나는 내가 QuerySetMock에 반환 값으로 추가 MyModel 인스턴스를 포함 result 기대를 호출 할 때 부르지 만 잘 모르겠다. 두번째 결과 변수 MyModel 모든 인스턴스를 포함하지 않을 것이기 때문에

테스트는 실패한다.

from django.db import models 
print models.Manager.filter 

반환 : 내가 잘못 뭐하는 거지

<SharedMock name='mock.iterator' id='4514208912'> 

filter() 방법은 정말 내가 "디버그 인쇄"문을 추가 조롱 할 수 있는지?

답변

4

이 시도 :

import mock 
from mocktest.mockme.models import MyModel 

class SimpleTest(TestCase): 
    def test_chained_query(self): 
     my_model_value_mock = mock.patch(MyModel.objects, 'value') 
     my_model_value_mock.return_value.filter.return_value.count.return_value = 10000 
     self.assertTrue(my_model_value_mock.return_value.filter.return_value.count.called) 
+0

는 그' '값')'해야하지? – Splatmistro