Соединение макета и клиента в тестах Django - PullRequest
0 голосов
/ 15 ноября 2011

Я написал два класса: System и Order, которые представляют собой что-то вроде «онлайн-магазина распространения билетов».

Сделать заказ легко:

order = Order('title', set(['1', '2', '5']))
System.fill(order)

, но я хотел бы проверить мою функцию views.fill_order и проверить, правильно ли она выполняет заказ из параметров POST.Чтобы сделать это, я могу использовать макет и клиент, как это:

from core.order import Order
from core.system import System
from django.test.client import Client
from mock import Mock, sentinel

self.logged_client = Client()
# skipping logging process

Order = Mock(sentinel.return_value)
System = Mock()
System.fill = Mock()

# sending hypotetic POST
self.logged_client.post('/my_view_url/', {'title': self.PHANTOM, 'seat_numbers': '1I', 'seat_numbers': '3IV'})

System.fill.assert_called_with(Order.return_value)
Order.assert_called_with(self.PHANTOM, set(['1I', '2II', '3IV']))

Но ... это не работает (утверждает неудачу).Как это исправить?

Я знаю, это потому, что внутри моей функции views.fill_order я делаю:

from core.system import System
from core.order import Order

еще раз, но как заставить эти классы постоянно проверяться во время теста?

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

Ключ к успешному моделированию - помнить, что вам нужно заменить объекты в модуле, где они фактически используются, а не там, где определены ваши тесты.Итак, в вашем случае вы хотите импортировать модуль представления и заменить там классы:

from core.whatever import views
views.System = my_mock_system
views.Order = my_mock_order
1 голос
/ 15 мая 2013

Он не работает при издевательстве и использовании клиента, потому что кажется, что он запускает другой экземпляр проекта без смоделированных классов.Я не добился успеха в этом, похоже, единственный способ - создать экземпляр самого класса ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...