Python Mock call_count == 0 (ожидаемо: 1) с monkeypatch - PullRequest
0 голосов
/ 01 мая 2019

В моем модульном тесте я монтирую функцию в своем коде.В коде я вызываю функцию один раз.Объект Mock, который заменяет функцию в коде, возвращает call_count == 0 !!!

Это вызывает функцию в коде, а не фиктивный объект!(См. Вывод консоли ниже. В нем не должно быть сказано, что "asticsearch_connect был вызван ")

Вопрос: Как исправить код, чтобы он корректно исправлял функциюasticsearch_connect, call_count == 1 и утверждение проходит?

==============================

test_handler.py

import sys, os, inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
parentdir = "%s\\health_check"%os.path.dirname(parentdir)
sys.path.insert(0,parentdir)
print(parentdir)

import json
import pytest
import health_check
import app
import my_elastic_search
import mock
from mock import Mock

def test_lambda_handler(apigw_event, monkeypatch):
    # arrange
    elasticsearch_connect_mock = Mock()
    monkeypatch.setattr('health_check.app.elasticsearch_connect', elasticsearch_connect_mock)
    print("*************")

    # act
    ret = app.lambda_handler(apigw_event, "")
    print("call count: %s"%elasticsearch_connect_mock.call_count)

    # assert
    elasticsearch_connect_mock.assert_called_with('hostname', 'user', 'password')
    # print(elasticsearch_connect_mock.assert_called_with('{"hostname": "myhostname", "user": "myuser", "password": "mypass"}'))

app.py

import jon
import sys
import ssl
import boto3
import requests
from elasticsearch import Elasticsearch
from elasticsearch.connection import create_ssl_context
import elasticsearch

def lambda_handler(event, context):
    # Connect to Elasicsearch
    es = elasticsearch_connect("myhostname", "myuser", "mypass")

def elasticsearch_connect(hostname, user, password):
    print("elasticsearch_connect was called")

output ==> call_count: 0 (неверно)

*************
elasticsearch_connect was called
call count: 0

и утверждение тоже не выполняется (неверно)

     AssertionError: Expected call: mock('hostname', 'user', 'password')
E           Not called
...