2011-04-07 30 views
0

我試圖用Mox嘲笑django過濾器查詢。我遵循Mox網站上的說明,但是,由於我的django查詢是一種鏈式方法,它抱怨AndReturn()方法不存在。使用Mox嘲笑Django查詢

這裏是我的方法:

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異常:「查詢集」對象有沒有屬性「AndReturn」

注意,因爲有大量的數據庫表的是,甲骨文數據庫以及其他複雜情況,必須在不創建數據庫的情況下運行此單元測試。

回答

0

豈不是

device.CheckNameUniqueness().AndReturn(None) 

?這就是我閱讀Mox文檔的方式。儘管如此,我還沒有真正使用它。

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) 

如果你想查詢集鏈,你可以做一個查詢集的模擬,並讓它成爲回報:

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