2013-04-16 4 views
3

Whatever.objects.get_or_create를 패치하는 방법을 실제로 찾았지만 제안이나 아이디어를 얻지 못했습니다. 내가 함께 노력했다django에서 예외를 강제로 테스트하는 방법

...

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가 somewhen 예외가 발생하는지 테스트하려면 :

글쎄, 내 문제는 내가 이런 식으로 뭔가를해야한다는 것입니다 Mock(side_effect=Exception()) 그러나 나는 내가 기대하는 것을 얻기 위해 그것을 어떻게 사용하는지 정말로 모른다.

이 모든 기능은 해당 기능에 대해 100 % 적용 범위 (예외 라인은 적용되지 않음)와 그 밖의 많은 예외를 포함합니다.

이것을 테스트하고 코드를 작성하는 올바른 방법은 무엇입니까?

내가 뭘 잘못하고 있니?

+0

'create' 부분에 필수 필드를 제공 할 수 없습니다. 예외가 발생했습니다. – karthikr

답변

8

모의의 과 함께 파이썬의 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) 

이론상 효과가 있어야합니다.

+0

테스트했습니다. 테스트 통과, _mock_method_ 호출,하지만, 어떻게 side_effect 실제로 작동하는지 확신 할 수 있습니까? –

+0

그러나 그 방법에 대해 100 % 적용 범위를 얻는 데 도움이되었습니다. 고마워요! –

관련 문제