Насмешливый Django-запрос с использованием Mox
Я пытаюсь смоделировать запрос фильтра Django, используя Mox. Однако я следую инструкциям на веб-сайте Mox, поскольку мой запрос django является цепочечным методом, он жалуется на то, что метод AndReturn() не существует.
Вот мой метод:
def CheckNameUniqueness(device):
ex_device = device.__class__.objects.filter(name__iexact=device.name)
if not ex_device:
return None
if ex_device.count() > 0:
return ex_device
В моем модульном тесте я пытаюсь смоделировать метод фильтра, чтобы вернуть пустой список.
class testCheckNameUniqeness(unittest.TestCase):
""" Unit test for CheckNameUniqueness function """
def setUp(self):
self.device_mocker = mox.Mox()
def testCheckNameUniqenessNotExists(self):
device = self.device_mocker.CreateMock(models.Device)
device.name = "some name"
device.objects.filter(name__iexact=device.name).AndReturn(None)
# Put all mocks created by mox into replay mode
self.device_mocker.ReplayAll()
# Run the test
ret = CheckNameUniqueness(device)
self.device_mocker.VerifyAll()
self.assertEqual(None, ret)
Когда я запускаю свой тестовый пример, я получаю следующую ошибку: AttributeError: у объекта 'QuerySet' нет атрибута 'AndReturn'
Обратите внимание, что из-за большого количества таблиц базы данных, базы данных оракула и других сложностей этот модульный тест должен выполняться без создания базы данных.
2 ответа
Я столкнулся с этой же проблемой.
def testCheckNameUniqenessNotExists(self):
self.device_mocker.StubOutWithMock(models.Device, "objects")
models.Device.objects.filter(name__iexact=device.name).AndReturn(None)
# Put all mocks created by mox into replay mode
self.device_mocker.ReplayAll()
# Run the test
ret = CheckNameUniqueness(device)
self.device_mocker.VerifyAll()
self.assertEqual(None, ret)
Если вы хотите создать цепочку QuerySets, вы можете сделать макет QuerySet и сделать его возвращаемым:
from django.db.models.query import QuerySet
def testCheckNameUniqenessNotExists(self):
qs = self.device_mocker.CreateMock(QuerySet)
self.device_mocker.StubOutWithMock(models.Device, "objects")
models.Device.objects.filter(name__iexact=device.name).AndReturn(qs)
qs.count().AndReturn(1)
# Put all mocks created by mox into replay mode
self.device_mocker.ReplayAll()
# Run the test
ret = CheckNameUniqueness(device)
# etc...
Не было бы это
device.CheckNameUniqueness().AndReturn(None)
? Вот как я читаю документацию Mox. Я на самом деле еще не использовал его, хотя.