首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用botocore存根时的UnrecognizedClientException

使用botocore存根时的UnrecognizedClientException
EN

Stack Overflow用户
提问于 2018-04-20 06:25:09
回答 3查看 3K关注 0票数 2

我正在使用unittest测试一个函数,该函数使用boto3调用AWS。

该函数如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import boto3


def my_function():
    client = boto3.client('athena')
    res = client.start_query_exeuction(
        QueryString='SELECT * FROM logs',
        ResultConfiguration={'OutputLocation': 's3://mybucket'}
    )

    return res['QueryExecutionId']

在我的单元测试中,我使用botocore顽固来存根这个请求,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from botocore.stub import Stubber
import botocore.session

def test_my_function():    
    client = botocore.session.get_session().create_client('athena')
    client_res = {'QueryExecutionId': 'testid'}
    exp_params = {
        'QueryString': 'SELECT * FROM logs',
        'ResultConfiguration': {
            'OutputLocation': 's3://mybucket'
        }
    }
    with Stubber(client) as stubber:
        stubber.add_response('start_query_execution', client_res, exp_params)
        res = my_function()

    self.assertEqual(res, 'testid')

这个测试失败了

botocore.exceptions.ClientError:调用StartQueryExecution操作时发生错误(UnrecognizedClientException):请求中包含的安全令牌无效。

为什么会失败呢?是因为我在my_function()中创建了一个新客户端,它不同于在存根中使用的客户端吗?如果是的话,我如何测试这个?

任何帮助都是非常感谢的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-20 06:38:39

目前,my_function()正在创建一个新的客户端,并使用它而不是stubber

一种选择是修改my_function,以_client作为参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def my_function(_client=None):
    if _client is not None:
        client = _client
    else:
        client = boto3.client('athena')
    res = client.start_query_exeuction(
        QueryString='SELECT * FROM logs',
        ResultConfiguration={'OutputLocation': 's3://mybucket'}
    )

    return res['QueryExecutionId']

然后将stubber传递给my_function

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with Stubber(client) as stubber:
    stubber.add_response('start_query_execution', client_res, exp_params)
    res = my_function(_client=stubber)

另一种选择是使用模拟修补boto.client以返回顽固。

票数 2
EN

Stack Overflow用户

发布于 2021-11-03 16:35:31

与这里的其他答案类似,我的问题在于我试图使用一个新客户端,而我已经使用了moto

我糟糕的设置:

app.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import boto3

_DYNAMO_RESOURCE = boto3.resource('dynamodb')
_METADATA_TABLE_NAME = 'metadata'

def my_ddb_func():
  table = _DYNAMO_RESOURCE.Table(_METADATA_TABLE_NAME)
  # perform some Dynamo call
  response = table.scan(...)
  return response

unit_test.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import boto3
import moto
import app

@fixture(name='dynamo_resource')
def fixture_dynamo_resource():
  with mock_dynamodb2():
    resource = boto3.resource('dynamodb')
    yield resource

def test_my_ddb_func(dynamo_resource):
  # perform some base level call and assert
  response = app.my_ddb_func()
  assert response

这将导致UnrecognizedClientException。经过几个小时的搜索我的问题,我找不到任何对我有用的解决办法,因此我把它放在这里为那些在未来。

是什么修正了这个关于如何为AWS应用程序进行单元测试的博客(这就是我的应用程序,但仍然应该适用于不使用AWS的人):https://aws.amazon.com/blogs/developer/introducing-the-new-test-client-for-aws-chalice/

在题为“用进行测试”一节中,它有一个指定S3常量和getter的代码片段,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
_S3 = None


def get_s3_client():
    global _S3
    if _S3 is None:
        _S3 = boto3.client('s3')
    return _S3


@app.route('/resources/{name}', methods=['PUT'])
def send_to_s3(name):
    s3 = get_s3_client()
    s3.put_object(
        Bucket='mybucket',
        Key=name,
        Body=app.current_request.raw_body
    )
    return Response(status_code=204, body='')

这帮助解决了@Alasdair点击。生成的文件更改为:

app.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import boto3

_DYNAMO_RESOURCE = None
#                  ^^^^ Note the new default of None
_METADATA_TABLE_NAME = 'metadata'

# New getter method
def get_dynamo_resource():
  global _DYNAMO_RESOURCE
  if _DYNAMO_RESOURCE is None:
    _DYNAMO_RESOURCE = boto3.resource('dynamodb')
  return _DYNAMO_RESOURCE

def my_ddb_func():
  table = get_dynamo_resource().Table(_METADATA_TABLE_NAME)
  #       ^^^^^^^^^^^^^^^^^^^^^ Note the change to calling getter method
  # perform some Dynamo call
  response = table.scan(...)
  return response

unit_test.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import boto3
import moto
import app

@fixture(name='dynamo_resource')
def fixture_dynamo_resource():
  with mock_dynamodb2():
    resource = boto3.resource('dynamodb')
    yield resource

def test_my_ddb_func(dynamo_resource):
  # perform some base level call and assert
  response = app.my_ddb_func()
  assert response

有一些我没有包括的小细节,比如我的方法所采用的路径装饰器,因为它是本例中的一个虚拟方法,可能还有几个导入。重要的是默认使用None 的常量,并编写带有条件检查的getter方法,以获取正在使用的客户端。

这允许moto模拟的Dynamo在我的app.py之前实例化,这意味着在导入app.py时已经定义了_DYNAMO_RESOURCE,因此app.py没有机会设置自己的Dynamo,这允许我的单元测试使用我创建的同一个测试客户端。

票数 2
EN

Stack Overflow用户

发布于 2019-10-15 06:57:00

您还可以命名客户端,并执行如下操作:

mymodule.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import boto3

class Amazon
    client = boto3.client('athena') # giving easy namespace access
    @classmethod
    def my_function(cls):
        res = cls.client.start_query_exeuction(
                QueryString='SELECT * FROM logs',
                ResultConfiguration={'OutputLocation': 's3://mybucket'}
            )

        return res['QueryExecutionId']

然后在你的测试中做一个:

testmymodule.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from botocore.stub import Stubber
from mymodule import Amazon

def test_my_function():
    client_res = {'QueryExecutionId': 'testid'}
    exp_params = {
        'QueryString': 'SELECT * FROM logs',
        'ResultConfiguration': {
            'OutputLocation': 's3://mybucket'
        }
    }
    with Stubber(Amazon.client) as stubber:
        stubber.add_response('start_query_execution', client_res, exp_params)
        res = Amazon.my_function()

    self.assertEqual(res, 'testid')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49943938

复制
相关文章
WordPress插件——SM图床小工具插件
SM.MS图床外链小工具插件,是小文博客独自开发的图床插件,用于WordPress博客添加图床上传小工具以及评论框处添加上传图片按钮。
神无月
2018/05/11
5.2K4
WordPress插件——SM图床小工具插件
eclipse安装STS插件遇到的问题
第一次接触springboot,对于用惯了eclipse写代码的人来说,接受IDEA确实还要多花点时间去改变下,因为IDEA确实会节省下不必要的写代码时间。废话少说,直接上教程。
兮动人
2021/06/11
1.4K0
eclipse安装STS插件遇到的问题
关于python安装lxml插件的问题
  文章只是介绍自己安装时从安装不上到安装后报错,再到安装成功的心路历程,并不代表广大欧皇也会会出现同类型的问题,也不是总结和汇总各种出问题的原因.
py3study
2020/01/15
2.7K0
关于python安装lxml插件的问题
解决IDEA无法安装插件的问题
进入2018年以来,在IDEA插件中心中,安装插件经常安装失败,报连接超时的错误。如下:
小忽悠
2018/09/04
5.4K0
解决IDEA无法安装插件的问题
ubuntu 织梦DEDE安装 GD插件 OFF问题
安装Ubuntu 16.04安装织梦CMS开始发现所有目录没有权限,把源码的用户加入到php用户组下面,目录权限问题解决,接下来php-mysql显示为off,安装好php-mysql后,php-gd显示为off找了半天无解,最后在google下找到解决方案,但是与我碰到问题不一样,最后修改代码成功运行将off显示为on
笨兔儿
2019/05/26
1.9K0
【问题解决】Eclipse安装Aptana插件-(注意对应版本问题)
昨天,我同学用Eclipse安装Aptana插件,她弄了一天都没安装起,最后找了我。 然后我也按照她的那个方法安装,结果一样,安装不成功!
谙忆
2021/01/21
4410
【问题解决】Eclipse安装Aptana插件-(注意对应版本问题)
WordPress小工具导入导出插件:Widget Importer & Exporter
如果想将一个已设置好的网站小工具,导入到另一个网站中,这个小工具导入导出插件会派上用场。
星哥玩云
2022/06/11
4980
解决安装WordPress主题及插件需要输入FTP问题
安装一个WordPress好像挺简单,但是默认主题不喜欢,想更换一个,无奈本地可以更换,但是服务器更换的时候需要设置FTP 。OK,设置呗,好像我的用户名密码之类的都是正确的,就是不让我通过,因此,找了一下解决方案
hedeqiang
2019/12/17
3K0
解决IDEA插件安装慢、超时、不成功问题[通俗易懂]
Windows 系统 Hosts 文件路径:C:\Windows\System32\drivers\etc\hosts
全栈程序员站长
2022/08/26
11.1K0
解决IDEA插件安装慢、超时、不成功问题[通俗易懂]
小工具:ubuntu 下安装截图工具
tags: linux 截图 ubuntu 安装 sudo apt install flameshot 配置快捷键 设置-设备-键盘: 添加自定义快捷键: 命令: flameshot gui
超级大猪
2020/07/16
8030
小工具:ubuntu 下安装截图工具
idea插件安装和推荐插件
自定义背景图片, 你懂的, 操作方法: 安装完插件重启之后, 工具栏view找到set Background Image, 然后把本地图片路径放进去
全栈程序员站长
2022/09/01
1.5K0
Xcode安装插件
To install, open up your terminal and paste this: curl -fsSL https://raw.github.com/alcatraz/Alcatraz/master/Scripts/install.sh | sh or download the repository from Github and build it in Xcode. You'll need to restart Xcode after the installation. Alcatra
rectinajh
2018/05/17
1.8K1
studio安装插件
Android Studio安装插件的方式其实和Eclipse大同小异。废话不多说,直接上图: 区域1:你当前已经安装了的插件 区域2:在线安装 区域3:从硬盘安装,即针对你已经下载好了的插件,
xiangzhihong
2018/01/30
7260
studio安装插件
svn插件安装
以下是一些关键步骤: 其中http://subclipse.tigris.org/update_1.0.x是SVN插件的下载站点【subclipse是Eclipse的SVN插件】。 以update_1
xiangzhihong
2018/01/26
1.2K0
Obsidian 插件安装
一、官方商店安装 在设置中找到第三方插件,点击社区插件市场中的浏览即可。 二、侧载安装 0. 插件下载 插件下载有多种途径,自己最常用的途径就是下面的这个网站: Johnny学OB • OB (pory.app) 1. 关闭安全模式 2. 安装插件 ① 新建 plugins 目录 在目录配置文件夹里新建 plugins 目录,用来保存插件 ② 安装插件 将压缩包解压到该目录(连同目录一起解压) 3. 开启插件 重启 Obsidian,打开插件即可使用。
繁依Fanyi
2023/05/07
3.5K0
Obsidian 插件安装
Jira插件安装
一、Jira插件列表(可以将下面免费插件直接下载,然后登陆jira,在"插件管理"->"上传插件",将下载后的免费插件直接进行上传安装即可) 序号 插件名称 功能概要 供应商 资源 100用户报价($) 1 GreenHopper 敏捷项目管理 Atlassian 下载 2000 2 Universal Plugin Manager 管理插件的查找、安装、升级、授权等,也可用于Confluence,FishEye,Bamboo,Crucible 及S
洗尽了浮华
2018/04/18
9K0
Jira插件安装
eclipse 安装svn插件 maven插件 web插件 erm插件
maven :m2eclipse – http://m2eclipse.sonatype.org/sites/m2e
全栈程序员站长
2022/08/05
2.1K0
Typecho | 博客程序、主题及插件安装常见问题汇总
warning: 这篇文章距离上次修改已过608天,其中的内容可能已经有所变动。
Ranlychan
2023/03/05
1K0
Typecho | 博客程序、主题及插件安装常见问题汇总
idea安装mybatis插件_maven 插件
MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
全栈程序员站长
2022/11/10
2.1K0
关于安装Jenkins插件报错问题的最新发现
主要就是把update-center.json里的下载地址替换成镜像站的下载地址,而这两天我又发现了update-center.json里面的下载地址没有被替换掉,于是我看了看update-center.json里面的地址,发现已经由下载地址前缀已经由 http://updates.jenkins-ci.org 变成了 https://updates.jenkins.io/ ,打开网站,发现地址确实换新的了,然后我试着下载一个附件 https://updates.jenkins.io/download/plugins/BlazeMeterJenkinsPlugin/4.7/BlazeMeterJenkinsPlugin.hpi
全栈程序员站长
2022/07/05
3800
关于安装Jenkins插件报错问题的最新发现

相似问题

Android Studio中Android库与Java库的区别

33

Android Studio Java库模块与Android库模块

25

在Java 1.7中使用Android Studio

60

使用Java在Android Studio上使用WebRTC

10

在Android Studio中使用GitHub库

223
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文