2015-01-30 5 views
0

Я пришел к mock lib, который я никогда раньше не использовал в тестах. Мне нужен ответ от сервера (сервер на самом деле там нет), если он в сети или нет. Прежде всего, мне нужно проверить этот IP-адрес сервера, а затем проверить его состояние с ответом TRUE или FALSE. Server.object должен исходить от models.py, поэтому, я думаю, мне нужно начать использовать mock lib здесь. Может быть, некоторые из вас могли бы объяснить мне или показать мне несколько примеров получения поддельного ответа от «mock'server». Я прочитал Django testing, mock lib официальную документацию, но ни один из них не дал мне достаточно информации о том, как имитировать ответ от поддельного сервера.Модульные тесты Django mock

Пример кода:

def ssh_server(server_list, timeout=200): 
    online = False 
    response = [] 
    server_state = [] 
    timeout_stamp = datetime.datetime.now() + datetime.timedelta(seconds=timeout) 
    for obj_id in server_list: 
     server = models.Server.objects.get(id=obj_id) 
     ip = server.ip 
     client = paramiko.SSHClient() 
     client.load_system_host_keys() 
     client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
     while True: 
      try: 
       client.connect(ip, username='root') 
       online = True 
      except: 
       online = False 
+2

Как ваше приложение обычно связано с сервером? Модуль запросов? Если это так, вам нужно издеваться над этим. Возможно, добавьте некоторые примеры кода на ваш вопрос, трудно сказать, что нужно издеваться, не имея представления о реализации. –

+0

Приложение @GlenSwinfield подключается к серверу с помощью paramiko. В понедельник я выложу полезный код. – Dambre

+0

@GlenSwinfield любое решение? – Dambre

ответ

1

В тесте вам нужно пропатчить paramiko. Как это:

import unittest 
from mock import patch 

from mymodue import ssh_server 

class MyTest(unittest.TestCase): 

    @patch('mymodule.paramiko')  
    def test_server(self, paramiko): 
     ssh_server(server_list, timeout=200) 

Исключение не будет поднят, и поэтому client.connect(ip, username='root') получит TRUE.

Что это такое - издевается над модулем paramiko, где он импортируется в ваш модуль - это будет экземпляр MagicMock, который будет возвращать дополнительные экземпляры MagicMock всякий раз, когда вызывается их методы. Итак, в конечном счете client.connect(ip, username='root') просто вернет экземпляр MagicMock, он никогда не попытается соединиться ни с чем, ваш код не будет использовать paramiko вообще.

В зависимости от того, что вы тестируете, вы можете затем проверить переменную paramiko в своем тестовом методе, чтобы утверждать, что он использовался так, как вы планировали, т. Е. Его методы были вызваны правильно. Документация mock.patch поможет вам сделать это: http://www.voidspace.org.uk/python/mock/patch.html

+0

Что делает paramiko в _def test_server (self, paramiko): Делать? – Dambre

+0

Декодер патча заменяет paramiko в вашем модуле экземпляром MagicMock и передает тот же самый экземпляр в ваш тестовый метод. Это достигается двумя вещами: 1) Это означает, что модуль paramiko высмеивается 2) Это означает, что вы можете делать утверждения против MagicMock, чтобы узнать, как paramiko использовался в вашем методе, и заправлять его, чтобы возвращать конкретные ответы. Это все в документах, с которыми я связан. –

+0

Спасибо за помощь, немного поменяли и решили! – Dambre

Смежные вопросы