0

Mox を使用して django フィルター クエリをモックしようとしています。私は Mox Web サイトの指示に従っていますが、私の 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' object has no attribute 'AndReturn'

多数のデータベース テーブル、Oracle データベース、およびその他の複雑さのため、この単体テストはデータベースを作成せずに実行する必要があることに注意してください。

4

2 に答える 2

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)

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...
于 2012-06-07T23:22:19.217 に答える
0

そうではないでしょうか

device.CheckNameUniqueness().AndReturn(None) 

? それが私がMoxのドキュメントを読んだ方法です。私自身はまだ実際に使っていませんが。

于 2011-05-25T22:44:03.407 に答える