我正在尝试使用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‘对象没有'AndReturn’属性
请注意,由于有大量的数据库表、oracle数据库和其他复杂性,此单元测试必须在不创建数据库的情况下运行。
发布于 2011-05-26 06:44:03
不是吗?
device.CheckNameUniqueness().AndReturn(None) ?这就是我阅读Mox文档的方式。不过我自己还没有真正使用过它。
发布于 2012-06-08 07:22:19
我遇到了同样的问题。
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...https://stackoverflow.com/questions/5587517
复制相似问题