은 내가 Djangos model.Manager()
클래스에 체인 전화를 조롱하려합니다. 지금은 values()
과 filter()
방법을 조롱하고 싶습니다. 장고 ORM -. 모의 값() 필터() 체인
- 가상 환경
- 실행
pip install django mock mock-django nose django-nose
- 응용 프로그램을 만들기
manage.py startapp mockme
- 추가 프로젝트
django-admin.py startproject mocktest
- 만들기 만들기를
django_nose
및mocktest.mockme
~INSTALLED_APPS
(settings.py) 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()
방법은 정말 내가 "디버그 인쇄"문을 추가 조롱 할 수 있는지?
는 그' '값')'해야하지? – Splatmistro