7

私はWhatever.objects.get_or_createにパッチを当てる方法を本当に探しましたが、それを行う方法についての提案やアイデアは得られません。

さて、私の問題は、次のようなものがあることです。

def create_and_get_object(
    name, request, save_url=True, data=None):

    try:
        (object_type_, created) = Object.objects.get_or_create(
            name=name)
        try:
        ...
    except Exception:
        obj = None
        msg = ("Failed to get or create object `Object` with"
                "name='%s'" % name)
        logger_.exception(msg, extra={'request': request})
    return obj

だから、私は Object.objects.get_or_create がいつか例外をスローすることをテストしたい...

試してみましMock(side_effect=Exception())たが、それを使用して期待どおりの結果を得る方法がよくわかりません。

これはすべて、その関数 (例外行はカバーされていません) を 100% カバーするためのものであり、そのような例外を持つ他の多くのものです。

これをテストする正しい方法と、このようなコードは何ですか?

私は何を間違っていますか?

4

1 に答える 1

14

モックのpatch.objectでpython のwithステートメントを使用するのが好きです。あなたの場合、次のようになります。

from mock import patch
from django.test import TestCase
from django.db.models.manager import Manager
from anothermodule import create_and_get_object


class TestCreateAndGetObject(TestCase):
    def test_exception_throwing(self):
        with patch.object(Manager, 'get_or_create') as mock_method:
            mock_method.side_effect = Exception("test error")

            result = create_and_get_object('test', 'test')
            self.assertIsNone(result)

理論的にはうまくいくはずです。

于 2013-04-16T17:31:35.517 に答える