Насмешливый Django-запрос с использованием Mox - PullRequest
0 голосов
/ 08 апреля 2011

Я пытаюсь смоделировать запрос фильтра 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'

Обратите внимание, что из-за большого количества таблиц базы данных, базы данных Oracle и других сложностей этот модульный тест должен выполняться без создания базы данных.

Ответы [ 2 ]

0 голосов
/ 08 июня 2012

Я столкнулся с этой же проблемой.

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...
0 голосов
/ 26 мая 2011

Не было бы

device.CheckNameUniqueness().AndReturn(None) 

?Вот как я читаю документацию Mox.Хотя я сам еще не использовал его.

...