使用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
在我的单元测试中,我试图模拟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数据库和其他复杂情况,必须在不创建数据库的情况下运行此单元测试。     
已邀请:
不是吗
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...
    

要回复问题请先登录注册