小编osm*_*man的帖子

为Django Unittests干净地模拟远程服务器和API

我有一个棘手的问题,我似乎无法掌握.我目前正在为django自定义auth-backend编写单元测试.在我们的系统上,我们实际上有两个后端:一个是内置的django后端和一个自定义后端,它向基于Java的API发送请求,该API以XML的形式返回用户信息.现在,我正在编写单元测试,所以我不想在系统之外发送请求,我不是要尝试测试Java API,所以我的问题是如何解决这个问题并模拟副作用以最强大的方式.

我正在测试的函数是这样的,其中url设置值只是Java服务器的基本URL,用于验证用户名和密码数据并返回xml,服务值只是构建url查询的一些魔力,它对我们不重要:

@staticmethod
def get_info_from_api_with_un_pw(username, password, service=12345):
    url = settings.AUTHENTICATE_URL_VIA_PASSWORD
    if AUTH_FIELD == "username":
        params = {"nick": username, "password": password}
    elif AUTH_FIELD == "email":
        params = {"email": username, "password": password}
    params["service"] = service
    encoded_params = urlencode([(k, smart_str(v, "latin1")) for k, v in params.items()])
    try:
        # get the user's data from the api
        xml = urlopen(url + encoded_params).read()
        userinfo = dict((e.tag, smart_unicode(e.text, strings_only=True))
                        for e in ET.fromstring(xml).getchildren())
        if "nil" in userinfo:
            return userinfo
        else:
            return None
Run Code Online (Sandbox Code Playgroud)

因此,我们获取xml,将其解析为dict,如果key nil存在,那么我们可以返回dict并继续执行happy and authenticated.显然,一个解决方案就是找到一种方法以某种方式覆盖或monkeypatch …

python api django unit-testing mocking

9
推荐指数
1
解决办法
3797
查看次数

标签 统计

api ×1

django ×1

mocking ×1

python ×1

unit-testing ×1