6

CanonPerson次のモデルをモックしたい

def compute(self, is_send_emails, test_email_address):
        cpses = CanonPerson.objects.filter(persons__vpd=6,
                                           persons__country="United States",
                                           persons__role__icontains=';IX;').prefetch_related("persons").using("global")

        for cp in cpses:
           ...

CanonPerson.objects.filter継続できるように、相互利用可能なコレクションを返すためにモックする方法がまったくわかりません。

これは私がこれまでに行ったことです:

def test_X_count(self):
    with mock.patch('apps.dbank.models.CanonPerson.objects.filter') as canon_patch:
        mock_cp = mock.MagicMock(spec=CanonPerson)
        mock_person = mock.MagicMock(spec=Person)
        mock_person.vpd = 6
        mock_cp.country = "United States"
        mock_cp.role = ";IX;"
        mock_cp.persons.add(mock_person)
        canon_patch.objects.filter.return_value = [mock_cp] // ???
        oi = OptinInvites()
        oi.compute(False, None)
        oi.get_most_recent_email.assert_called_once_with(1)

私が見ることができる計算関数にcpsesは、MagicMock タイプがあります。ただし、それは反復可能ではなく、for loopその後、それを飛び越えるだけです。戻り値を[mock_cp]に設定することで、反復可能なリストを作成したと思いましたか?

4

1 に答える 1

8

戻り値を代入する行canon_patchが少し間違っています。あなたが持っている場所:

canon_patch.objects.filter.return_value = [mock_cp]

そのはず:

canon_patch.return_value = [mock_cp]

canon_patchすでに「objects.filter」のモックです。

[mock_cp]を呼び出すと、元の回線が返されCanonPerson.objects.filter.objects.filter()ます。

実際にモデルにパッチを当てたい場合CanonPerson、パッチラインは次のようになります:

with mock.patch('apps.dbank.models.CanonPerson') as canon_patch:

また、インポート元の場所ではなく、使用されている場所でモックする必要がある場合もあります。したがって、テストでパッチコードCanonPersonと呼ばれるモジュールで使用していると仮定するとmy_module、次のようになります。

with mock.patch('my_module.CanonPerson') as canon_patch:
于 2014-10-24T12:09:52.013 に答える