0

我正在尝试使用 Mox 模拟 django 过滤器查询。我按照 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

在我的单元测试中,我试图模拟 filter 方法以返回一个空列表。

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' object has no attribute 'AndReturn'

请注意,由于数据库表、oracle 数据库和其他复杂性的数量很大,因此必须在不创建数据库的情况下运行此单元测试。

4

2 回答 2

0

难道不是

device.CheckNameUniqueness().AndReturn(None) 

? 这就是我阅读 Mox 文档的方式。我自己还没有真正使用过它。

于 2011-05-25T22:44:03.407 回答
0

我遇到了同样的问题。

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)

如果要链接 QuerySet,可以模拟 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...
于 2012-06-07T23:22:19.217 回答