mock side_effect有输入和无输入的情况

#!/usr/bin/env python
# -*- coding:utf-8 -*-  
"""
@version: python2.7
@author: ‘liujiantao‘ 
@contact: [email protected]
@site: ${SITE}
@software: PyCharm
@file: test_featureDealTimeSvc.py
@time: 18-4-10 下午5:58
"""
import datetime
from unittest import TestCase

import mock

from api.feature_extract_time_node_api_svc import FeatureExtractTimeNodeApiSvc
from biz.consts.biz_consts import BizConsts
from biz.integration_api.revoke.feature_deal_revoke_time_svc import FeatureDealRevokeTimeSvc
from biz.integration_api.revoke.sub.network_features_time import NetworkFeaturesTime
from common.utils.get_time_now_utils import SwapperUtils
from test.test_clean.test_common.test_utils import TestUtils


class TestFeatureDealRevokeTimeSvc(TestCase):
    """

    """

    t_u = TestUtils()

    @mock.patch.object(SwapperUtils, 'get_time_now')
    @mock.patch.object(FeatureExtractTimeNodeApiSvc, 'get_cmp_basic_time_node_api')
    @mock.patch.object(FeatureExtractTimeNodeApiSvc, 'get_network_main_cmp_info_api')
    @mock.patch.object(FeatureExtractTimeNodeApiSvc, 'get_judgedoc_shinfo_time_node_api')
    @mock.patch.object(FeatureExtractTimeNodeApiSvc, 'get_trademark_time_node_api')
    @mock.patch.object(NetworkFeaturesTime, 'set_network_feature_time')
    @mock.patch.object(FeatureExtractTimeNodeApiSvc, 'get_bidding_statistic_time_node_api')
    def test_get_time_feature(self, get_bidding_statistic_time_node_api, set_network_feature_time,
                              get_trademark_time_node_api, get_judgedoc_shinfo_time_node_api,
                              get_network_main_cmp_info_api,
                              get_cmp_basic_time_node_api, get_time_now):
        """
        正常营业
        """
        # -- given
        # mocks

        get_time_now.return_value = datetime.datetime(2015, 2, 12)
        last_time = get_time_now.return_value.strftime('%Y-%m-%d')
        first_time = '2013-02-12'
        second_time = '2014-02-12'
        get_cmp_basic_time_node_api.return_value, get_network_main_cmp_info_api.return_value = self.__get_cmp_info()
        get_judgedoc_shinfo_time_node_api.side_effect = self.__side_effect_judgedoc_shinfo('2009-12-11')
        get_trademark_time_node_api.side_effect = self.__side_effect_trademark_time('2009-12-11')
        set_network_feature_time.side_effect = self.__side_effect_set_network_feature
        get_bidding_statistic_time_node_api.return_value = self.__get_bid_info()

        feature_deal_time_svc = FeatureDealRevokeTimeSvc()

        self.__assert_normal(feature_deal_time_svc, first_time, second_time, last_time)
        self.__assert_no_saic_data(feature_deal_time_svc, get_cmp_basic_time_node_api)
        self.__assert_return_cancel(feature_deal_time_svc, get_cmp_basic_time_node_api)
        self.__assert_cancel_with_no_dx_time(feature_deal_time_svc, get_cmp_basic_time_node_api,get_network_main_cmp_info_api)
        self.__assert_normal_dxtime_equal_opentime(feature_deal_time_svc, get_cmp_basic_time_node_api,get_network_main_cmp_info_api)

    def __assert_normal_dxtime_equal_opentime(self,feature_deal_time_svc, get_cmp_basic_time_node_api,get_network_main_cmp_info_api):
        """
        常规检查,从网络图获取的两个时间相等
        """
        # given
        company_name = u'北京龙盛源小额贷款有限公司'
        node_num = 3
        get_cmp_basic_time_node_api.return_value, get_network_main_cmp_info_api.return_value = self.__get_dxtime_equal_opentime_info()
        # when
        res = feature_deal_time_svc.get_time_features(company_name, node_num)

        # then
        self.t_u.assert_equal(BizConsts.DATA_STATE_OTHER_ABNORMAL, res.result_code)



    def __assert_cancel_with_no_dx_time(self,feature_deal_time_svc, get_cmp_basic_time_node_api,get_network_main_cmp_info_api):
        """
        已吊销,但没有吊销时间
        """
        # given
        company_name = u'北京龙盛源小额贷款有限公司'
        node_num = 3
        get_cmp_basic_time_node_api.return_value,get_network_main_cmp_info_api.return_value = self.__get_dx_cmp_no_dx_time_info()
        # when
        result = feature_deal_time_svc.get_time_features(company_name, node_num)

        # then
        self.t_u.assert_equal(BizConsts.DATA_STATE_OTHER_ABNORMAL, result.result_code)


    def __assert_normal(self, feature_tme_svc, first_time, second_time, last_time):
        """
        常规检查
        """
        # -- when
        res = feature_tme_svc.get_time_features(company_name=u'北京龙盛源小额贷款有限公司', node_num=3)

        # -- then
        assert res.time_map_features[last_time]
        k = res.time_map_features[last_time]
        print(type(k))
        self.t_u.print_domain(res)
        self.assertEqual(3, len(res.time_map_features.keys()))
        self.assertEqual(2, res.time_map_features[last_time].address_change_cnt)
        self.assertEqual(6, res.time_map_features[last_time].established_years)
        self.assertEqual(0, res.time_map_features[last_time].fr_change_cnt)
        self.assertEqual(3, res.time_map_features[last_time].regcap_change_cnt)
        self.assertEqual(6, res.time_map_features[first_time].bidding_cnt)
        self.assertEqual(9, res.time_map_features[second_time].bidding_cnt)
        self.assertEqual(11, res.time_map_features[last_time].bidding_cnt)
        self.assertEqual(6, res.time_map_features[last_time].judgedoc_cnt)
        self.assertEqual(4, res.time_map_features[last_time].trade_mark_cnt)

    def __assert_no_saic_data(self, feature_deal_time_svc, get_cmp_basic_time_node_api):
        """
        没有工商数据
        """
        # given
        company_name = u'北京龙盛源小额贷款有限公司'
        node_num = 3
        get_cmp_basic_time_node_api.return_value = self.__get_cmp_info_no_saic_data()
        # when
        result = feature_deal_time_svc.get_time_features(company_name, node_num)

        # then
        self.t_u.assert_equal(BizConsts.OUTPUT_STATUS_NONE_SAIC, result.result_code)

    def __assert_return_cancel(self, feature_deal_time_svc, get_cmp_basic_time_node_api):
        """
        吊销企业 --通过工商数据判断得知
        """
        # given
        company_name = u'北京龙盛源小额贷款有限公司'
        node_num = 3
        get_cmp_basic_time_node_api.return_value = self.__get_cmp_info_cancel()

        # when
        result = feature_deal_time_svc.get_time_features(company_name, node_num)

        # then
        self.t_u.assert_equal(BizConsts.DATA_STATE_NORMAL, result.result_code)
        self.t_u.assert_equal(True, result.is_cancel_maybe().get())

    @staticmethod
    def __get_cmp_info():
        cmp_info = {
            "requestId": "ff937c2e-ceec-4ea1-a8cb-f1d47d7302aa",
            "code": 0,
            "message": "success",
            "data": {
                "companyName": "北京龙盛源小额贷款有限公司",
                "province": "bj",

                "basicList": [
                    {
                        "enterpriseName": "北京龙盛源小额贷款有限公司",
                        "esDate": "2009-12-11",
                        "openFrom": "2009-12-11",
                        "openTo": "2059-12-10",
                        "enterpriseStatus": "开业",
                        "cancelDate": "",
                        "revokeDate": "",
                        "address": "北京市房山区良乡长虹东路2号1号楼一层、二层",
                        "abuItem": "",
                        "cbuItem": "",
                        "industryCode": "6639",
                        "industryName": "金融业",
                        "recCap": "",
                        "auditDate": "2018-01-18"
                    }
                ],
                "alterList": [
                    {
                        "altDate": "2016-04-26",
                        "altItem": "董事(理事)、经理、监事"
                    },
                    {
                        "altDate": "2015-11-18",
                        "altItem": "投资人"
                    },
                    {
                        "altDate": "2014-11-17",
                        "altItem": "股东改变姓名或名称"

                    },
                    {
                        "altDate": "2014-11-17",
                        "altItem": "投资人"
                    },
                    {
                        "altDate": "2012-07-03",
                        "altItem": "董事(理事)、经理、监事"
                    },
                    {
                        "altDate": "2012-07-03",
                        "altItem": "董事(理事)、经理、监事"
                    },
                    {
                        "altDate": "2011-10-12",
                        "altItem": "注册资本"
                    },
                    {
                        "altDate": "2011-10-12",
                        "altItem": "实收资本(金)"
                    },
                    {
                        "altDate": "2011-10-12",
                        "altItem": "注册资本"
                    },
                    {
                        "altDate": "2010-09-01",
                        "altItem": "住所"
                    },
                    {
                        "altDate": "2010-04-02",
                        "altItem": "住所"
                    }
                ]
            }
        }
        dx_time = {
            "earliestActiveTime": "2017-08-02",
            "latestActiveTime": "2015-02-12"
        }
        return cmp_info, dx_time
    @staticmethod
    def __get_cmp_info_cancel():
        return {
            "data": {
                "basicList": [
                    {
                        "enterpriseName": "北京龙盛源小额贷款有限公司",
                        "esDate": "2009-12-11",
                        "openFrom": "2009-12-11",
                        "openTo": "2059-12-10",
                        "enterpriseStatus": "吊销",
                        "cancelDate": "",
                        "revokeDate": "",
                        "address": "北京市房山区良乡长虹东路2号1号楼一层、二层",
                        "abuItem": "",
                        "cbuItem": "",
                        "industryCode": "6639",
                        "industryName": "金融业",
                        "recCap": "",
                        "auditDate": "2018-01-18"
                    }
                ],
                "alterList": [
                ]
            }
        }
    @staticmethod
    def __get_dx_cmp_no_dx_time_info():
        cmp_info = {
            "requestId": "ff937c2e-ceec-4ea1-a8cb-f1d47d7302aa",
            "code": 0,
            "message": "success",
            "data": {
                "companyName": "北京龙盛源小额贷款有限公司",
                "province": "bj",

                "basicList": [
                    {
                        "enterpriseName": "北京龙盛源小额贷款有限公司",
                        "esDate": "2009-12-11",
                        "openFrom": "2009-12-11",
                        "openTo": "",
                        "enterpriseStatus": "吊销",
                        "cancelDate": "",
                        "revokeDate": "",
                        "address": "北京市房山区良乡长虹东路2号1号楼一层、二层",
                        "abuItem": "",
                        "cbuItem": "",
                        "industryCode": "6639",
                        "industryName": "金融业",
                        "recCap": "",
                        "auditDate": "2018-01-18"
                    }
                ],
                "alterList": [
                    {
                        "altDate": "2016-04-26",
                        "altItem": "董事(理事)、经理、监事"
                    },
                    {
                        "altDate": "2015-11-18",
                        "altItem": "投资人"
                    },
                    {
                        "altDate": "2014-11-17",
                        "altItem": "股东改变姓名或名称"

                    },
                    {
                        "altDate": "2014-11-17",
                        "altItem": "投资人"
                    },
                    {
                        "altDate": "2012-07-03",
                        "altItem": "董事(理事)、经理、监事"
                    },
                    {
                        "altDate": "2012-07-03",
                        "altItem": "董事(理事)、经理、监事"
                    },
                    {
                        "altDate": "2011-10-12",
                        "altItem": "注册资本"
                    },
                    {
                        "altDate": "2011-10-12",
                        "altItem": "实收资本(金)"
                    },
                    {
                        "altDate": "2011-10-12",
                        "altItem": "注册资本"
                    },
                    {
                        "altDate": "2010-09-01",
                        "altItem": "住所"
                    },
                    {
                        "altDate": "2010-04-02",
                        "altItem": "住所"
                    }
                ]
            }
        }
        dx_time = {
            "earliestActiveTime": "2017-08-02",
            "latestActiveTime": ""
        }
        return cmp_info, dx_time

    @staticmethod
    def __get_dxtime_equal_opentime_info():
        cmp_info = {
            "requestId": "ff937c2e-ceec-4ea1-a8cb-f1d47d7302aa",
            "code": 0,
            "message": "success",
            "data": {
                "companyName": "北京龙盛源小额贷款有限公司",
                "province": "bj",

                "basicList": [
                    {
                        "enterpriseName": "北京龙盛源小额贷款有限公司",
                        "esDate": "",
                        "openFrom":"",
                        "openTo":"" ,
                        "enterpriseStatus": "吊销",
                        "cancelDate": "",
                        "revokeDate": "",
                        "address": "北京市房山区良乡长虹东路2号1号楼一层、二层",
                        "abuItem": "",
                        "cbuItem": "",
                        "industryCode": "6639",
                        "industryName": "金融业",
                        "recCap": "",
                        "auditDate": "2018-01-18"
                    }
                ],
                "alterList": [
                    {
                        "altDate": "2016-04-26",
                        "altItem": "董事(理事)、经理、监事"
                    },
                    {
                        "altDate": "2015-11-18",
                        "altItem": "投资人"
                    },
                    {
                        "altDate": "2014-11-17",
                        "altItem": "股东改变姓名或名称"

                    },
                    {
                        "altDate": "2014-11-17",
                        "altItem": "投资人"
                    },
                    {
                        "altDate": "2012-07-03",
                        "altItem": "董事(理事)、经理、监事"
                    },
                    {
                        "altDate": "2012-07-03",
                        "altItem": "董事(理事)、经理、监事"
                    },
                    {
                        "altDate": "2011-10-12",
                        "altItem": "注册资本"
                    },
                    {
                        "altDate": "2011-10-12",
                        "altItem": "实收资本(金)"
                    },
                    {
                        "altDate": "2011-10-12",
                        "altItem": "注册资本"
                    },
                    {
                        "altDate": "2010-09-01",
                        "altItem": "住所"
                    },
                    {
                        "altDate": "2010-04-02",
                        "altItem": "住所"
                    }
                ]
            }
        }
        dx_time = {
            "earliestActiveTime": "2017-08-02",
            "latestActiveTime": "2017-08-02"
        }
        return cmp_info, dx_time
    @staticmethod
    def __get_cmp_info_no_saic_data():
        return {}

    def __side_effect_judgedoc_shinfo(self, verify_open_from):
        time_map_judgedoc_shinfo = self.__get_time_map_judgedoc_shinfo()

        def inner_effect(*arg):
            start_time = arg[1]
            self.assertEqual(verify_open_from, start_time)
            to_time = arg[2]
            return time_map_judgedoc_shinfo[to_time]

        return inner_effect
注:此处*arg对应get_trademark_time_node_api(self, company_name, from_time, to_time)
中的company_name, from_time, to_time; 返回的是一个函数,闭包的概念,
函数作为返回值

高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。

我们来实现一个可变参数的求和。通常情况下,求和的函数是这样定义的:

def calc_sum(*args):
    ax = 0
    for n in args:
        ax = ax + n
    return ax

但是,如果不需要立刻求和,而是在后面的代码中,根据需要再计算怎么办?可以不返回求和的结果,而是返回求和的函数:

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum

当我们调用lazy_sum()时,返回的并不是求和结果,而是求和函数:

>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function lazy_sum.<locals>.sum at 0x101c6ed90>

调用函数f时,才真正计算求和的结果:

>>> f()
25

在这个例子中,我们在函数lazy_sum中又定义了函数sum,并且,内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。

请再注意一点,当我们调用lazy_sum()时,每次调用都会返回一个新的函数,即使传入相同的参数:

>>> f1 = lazy_sum(1, 3, 5, 7, 9)
>>> f2 = lazy_sum(1, 3, 5, 7, 9)
>>> f1==f2
False

f1()和f2()的调用结果互不影响。
闭包

注意到返回的函数在其定义内部引用了局部变量args,所以,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用,所以,闭包用起来简单,实现起来可不容易。

另一个需要注意的问题是,返回的函数并没有立刻执行,而是直到调用了f()才执行。我们来看一个例子:

def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()

在上面的例子中,每次循环,都创建了一个新的函数,然后,把创建的3个函数都返回了。

你可能认为调用f1(),f2()和f3()结果应该是149,但实际结果是:

>>> f1()
9
>>> f2()
9
>>> f3()
9

全部都是9!原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9。
返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。

如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变:

def count():
    def f(j):
        def g():
            return j*j
        return g
    fs = []
    for i in range(1, 4):
        fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
    return fs

再看看结果:

>>> f1, f2, f3 = count()
>>> f1()
1
>>> f2()
4
>>> f3()
9

缺点是代码较长,可利用lambda函数缩短代码。

    def __side_effect_trademark_time(self, verify_open_from):
        time_map_trademark_time = self.__get_time_map_trademark_time()

        def inner_effect(*arg):
            start_time = arg[1]
            self.assertEqual(verify_open_from, start_time)
            to_time = arg[2]
            return time_map_trademark_time[to_time]

        return inner_effect

    @staticmethod
    def __side_effect_set_network_feature(*arg):
        time_map_features = arg[1]
        features = time_map_features['2013-02-12']
        features.network_share_cancel_cnt = 1
        features.cancel_cnt = 2
        features.network_share_zhixing_cnt = 3
        features.network_share_judge_doc_cnt = 4
        features.net_judgedoc_defendant_cnt = 5
        features.judge_doc_cnt = 6
        features = time_map_features['2014-02-12']
        features.network_share_cancel_cnt = 11
        features.cancel_cnt = 21
        features.network_share_zhixing_cnt = 31
        features.network_share_judge_doc_cnt = 41
        features.net_judgedoc_defendant_cnt = 51
        features.judge_doc_cnt = 61
        features = time_map_features['2015-02-12']
        features.network_share_cancel_cnt = 12
        features.cancel_cnt = 22
        features.network_share_zhixing_cnt = 32
        features.network_share_judge_doc_cnt = 42
        features.net_judgedoc_defendant_cnt = 52
        features.judge_doc_cnt = 62
        return time_map_features
注:此处的×arg 对应set_network_feature_time(self, company_name, time_map_features)中的
company_name, time_map_features;跟位置有关系,从0开始;

    @staticmethod
    def __get_bid_info():
        return {'result': {
            '201302': {u'statistic': {u'bidCount': 6}},
            '201402': {u'statistic': {u'bidCount': 3}},
            '201501': {u'statistic': {u'bidCount': 2}}
        }}

    @staticmethod
    def __get_time_map_judgedoc_shinfo():
        """
        裁判文书
        """
        return {
            '2013-02-12': {
                "data": {
                    "reasonCount": [
                        {
                            "count": 1
                        }
                    ]
                }
            },
            '2014-02-12': {
                "data": {
                    "reasonCount": [
                        {
                            "count": 2
                        }
                    ]
                }
            },
            '2015-02-12': {
                "data": {
                    "reasonCount": [
                        {
                            "count": 1
                        },
                        {
                            "count": 2
                        },
                        {
                            "count": 3
                        }
                    ]
                }
            }
        }

    @staticmethod
    def __get_time_map_trademark_time():
        """
        裁判文书
        """
        return {
            '2013-02-12': {
                "data": {
                    "total": 1
                }
            },
            '2014-02-12': {
                "data": {
                    "total": 2
                }
            },
            '2015-02-12': {
                "data": {
                    "total": 4
                }
            }
        }

猜你喜欢

转载自blog.csdn.net/sinat_26566137/article/details/81035275