首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Mox模拟Django查询

使用Mox模拟Django查询
EN

Stack Overflow用户
提问于 2011-04-08 04:53:57
回答 2查看 939关注 0票数 0

我正在尝试使用Mox模拟django过滤器查询。我正在遵循Mox网站上的说明,然而,由于我的django查询是一个链式方法,它报告AndReturn()方法不存在。

下面是我的方法:

代码语言:javascript
复制
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方法以返回一个空列表。

代码语言:javascript
复制
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数据库和其他复杂性,此单元测试必须在不创建数据库的情况下运行。

EN

回答 2

Stack Overflow用户

发布于 2011-05-26 06:44:03

不是吗?

代码语言:javascript
复制
device.CheckNameUniqueness().AndReturn(None) 

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

票数 0
EN

Stack Overflow用户

发布于 2012-06-08 07:22:19

我遇到了同样的问题。

代码语言:javascript
复制
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并让它作为返回值:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5587517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档