单元测试——使用Mox来模拟Django查询



我正在尝试使用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

在我的单元测试中,我试图模拟过滤器方法来返回一个空列表。

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数据库和其他复杂性,这个单元测试必须在不创建数据库的情况下运行。

device.CheckNameUniqueness().AndReturn(None) 

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

我也遇到过同样的问题。

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...

相关内容

  • 没有找到相关文章