Podążałem za Django Doc do pisania testów z AssertraissMessage () Ale problem jest problemem, że sam wyjątek jest podniesiony podczas wykonywania testu (tak, test nie jest wykonywany). Zauważ, że wyjątek zwany wyjątkiem, który dobrowolnie podnosiam w metodzie mojego modelu (nie w widoku).

class MyTestCase(TestCase):
    def test_invertRewardState_view_fails_notmy_reward(self):
        self.client.login(email='gislaine@toto.com', password='azerty')
        resp = self.client.get(reverse(invertRewardState, args=(1,)))
        self.assertRaisesMessage(
            expected_exception=Exception,
            expected_message=EXC_NOT_YOURS,
            callable_obj=resp)

Jak powinienem użyć AssertraissMessage (), aby mój test był wykonywany bez podnoszenia wyjątku? Dzięki.

Edytuj : Po wypróbowaniu fiseTru 1st rozwiązanie problem jest nadal taki sam. Gdy tylko mój test wchodzi do części resp = ..., Widok zostanie wywołany, wtedy powiązana metoda jest nazywana i podnosi wyjątek. Pełny ślad stosu:

Traceback (most recent call last):
  File "/Users/walt/Code/hellodjango/clientizr/tests.py", line 338, in test_invertRewardState_view_fails_notmy_reward
    resp = self.client.get(reverse(invertRewardState, args=('1',)))
  File "/Users/walt/Code/hellodjango/venv/lib/python2.7/site-packages/django/test/client.py", line 473, in get
    response = super(Client, self).get(path, data=data, **extra)
  File "/Users/walt/Code/hellodjango/venv/lib/python2.7/site-packages/django/test/client.py", line 280, in get
    return self.request(**r)
  File "/Users/walt/Code/hellodjango/venv/lib/python2.7/site-packages/django/test/client.py", line 444, in request
    six.reraise(*exc_info)
  File "/Users/walt/Code/hellodjango/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 114, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/walt/Code/hellodjango/venv/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 22, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/Users/walt/Code/hellodjango/clientizr/views.py", line 234, in invertRewardState
    reward.invert_reward_state(request.user)
  File "/Users/walt/Code/hellodjango/clientizr/models.py", line 606, in invert_reward_state
    self.throw_error_if_not_owner_reward(cur_user)
  File "/Users/walt/Code/hellodjango/clientizr/models.py", line 587, in throw_error_if_not_owner_reward
    raise Exception(EXC_NOT_YOURS)
Exception: Cet objet n'est pas le v\xf4tre
7
David D. 13 sierpień 2014, 17:34

2 odpowiedzi

Najlepsza odpowiedź

Używasz assertRaisesMessage jako menedżera kontekstu wokół kodu, którego oczekujesz:

class MyTestCase(TestCase):
    def test_invertRewardState_view_fails_notmy_reward(self):
        self.client.login(email='gislaine@toto.com', password='azerty')
        url = reverse(invertRewardState, args=(1,))
        with self.assertRaisesMessage(Exception, EXC_NOT_YOURS):
            self.client.get(url)
11
Ned Batchelder 13 sierpień 2014, 13:43

Jeśli używasz self.client.get, nie otrzymasz wyjątku bezpośrednio, ale możesz sprawdzić kod statusu.

def test_invertRewardState_view_fails_notmy_reward(self):
    self.client.login(email='gislaine@toto.com', password='azerty')
    resp = self.client.get(reverse(invertRewardState, args=('1',)))
    self.assertEqual(resp.status_code, 500)
    self.assertIn(EXC_NOT_YOURS in resp.content)

Jeśli chcesz uzyskać wyjątek, zadzwoń bezpośrednio w widoku.

def test_invertRewardState_view_fails_notmy_reward(self):
    request = HttpRequest()
    request.user = User.objects.create(email='gislaine@toto.com')  # login
    self.assertRaisesMessage(Exception, EXC_NOT_YOURS, invertRewardState, '1')

Możesz użyć formularza menedżera kontekstu, ponieważ sugeruje się ned batchelder.

1
falsetru 13 sierpień 2014, 14:02