在 Elixir 中测试异步代码

2024-02-15

我想测试一个正在使用的函数Task.async

为了让我的测试通过,我需要让它在断言之前休眠 100 毫秒,否则测试进程会在执行异步任务之前被终止。

有没有更好的办法?

编辑,添加代码示例:

我想测试的代码(大致):

def search(params) do
  RateLimiter.rate_limit(fn ->
    parsed_params = ExTwitter.Parser.parse_request_params(params)
    json = ExTwitter.API.Base.request(:get, "1.1/search/tweets.json", parsed_params)
    Task.async(fn -> process_search_output(json) end)
    new_max_id(json)
  end)
end

和我已经编写的测试(仅适用于睡眠调用)

test "processes and store tweets" do
  with_mock ExTwitter.API.Base, [request: fn(_,_,_) -> json_fixture end] do
    with_mock TwitterRateLimiter, [rate_limit: fn(fun) -> fun.() end] do
      TSearch.search([q: "my query"])
      :timer.sleep(100)
      # assertions 
      assert called TStore.store("some tweet from my fixtures")
      assert called TStore.store("another one")
    end
  end
end

由于问题有点模糊,我在这里给出一般性的答案。通常的技术是监视进程并等待 down 消息。像这样的东西:

task = Task.async(fn -> "foo" end)
ref  = Process.monitor(task.pid)
assert_receive {:DOWN, ^ref, :process, _, :normal}, 500

一些重要的事情:

  • 元组的第五个元素是退出原因。我断言任务出口是:normal。如果您期望再次退出,请相应地更改它。

  • 第二个值在assert_receive是超时。考虑到您当前的睡眠时间为 100 毫秒,500 毫秒听起来是一个合理的时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Elixir 中测试异步代码 的相关文章

  • Elixir 变量真的是不可变的吗?

    在 Dave Thomas 的 Programming Elixir 一书中 他指出 Elixir 强制执行不可变数据 并接着说道 在 Elixir 中 一旦变量引用了诸如 1 2 3 之类的列表 您就知道它将始终引用相同的值 直到您重新绑
  • 了解 Elixir 函数参数中的模式匹配

    在 Elixir in Action 一书中 其中一个示例的一个函数颠覆了我对模式匹配的理解 def add entry TodoList entries entries auto id auto id todo list entry do
  • 使用 ECTO 和 put_assoc/4 进行多对多

    我尝试将 2 个现有多对多记录与 ECTO 和 put assoc 4 关联 但在尝试更新时不会删除元素 基本上我有项目和用户 为了管理用户对项目的访问 我有表 user project def Project do schema proj
  • 在 Elixir 中将映射转换为关键字列表

    我有一张以下形式的地图 browser name gt Chrome platform gt linux 我需要将其转换为关键字列表 browser name Chrome platform linux 实现这一目标的最佳方法是什么 这行不
  • Elixir:修改模块属性值

    是否有可能实现以下行为 其中尝试更改模块属性的值以改变模块方法的行为 defmodule Adder do num to add 10 def addTo input do input num to add end IO inspect A
  • Elixir 或 Erlang 程序可以编译为独立的二进制文件吗?

    它说 Elixir 有一个工具叫做elixircErlang 有一个工具叫做erlc to 编译模块 http elixir lang org crash course html elixir用来 在此之后 您可以立即运行代码elixir命
  • 从映射中添加/删除键值对

    如何在 Elixir 映射中添加 和删除 键值对 这不起作用 map a 1 b 2 c 3 map d 4 添加到地图 Use Map put map key value https hexdocs pm elixir Map html
  • Postgrex.Error ERROR 42501 unavailable_privilege 无法创建扩展 citext

    我正在尝试创建迁移 这是输出 MIX ENV prod DATABASE URL URL mix ecto migrate info execute CREATE EXTENSION citext Postgrex Error ERROR
  • Phoenix框架中如何处理关联和嵌套表单?

    Phoenix框架中如何处理关联和嵌套表单 如何创建具有嵌套属性的表单 在控制器和模型中如何处理它 有一个处理 1 1 情况的简单示例 想象一下我们有一个Car and an Engine模型和显然Car有一个Engine 所以有汽车型号的
  • Elixir - 递归列表值的总和

    只是尝试对列表值进行简单求和 defmodule Mth do def sum list do 0 end def sum list H T do H sum list T end end IO puts Mth sum list 1 2
  • Ecto 构建多个关联

    目前正在使用 Ecto Postgres 从事 Phoenix 项目 创建评论时 作为评论belongs to用户和文章 有没有一种方法可以构建多个关联来生成一个变更集 像这样的伪代码 comment changeset build ass
  • 当作为函数参数传递时,elixir 是否会生成映射的副本?

    换句话说 我想知道在 Elixir 中 映射是通过值还是通过引用传递给函数 鉴于 Elixir 的无副作用原则 我怀疑这是有价值的 但是大地图不会造成巨大的重复效率低下吗 在此先感谢您的帮助 由于 Elixir 中的所有术语都是不可变的 因
  • Phoenix:订购查询集

    我 一个菜鸟 为了好玩而玩弄 Phoenix 框架并构建一个小型 Twitter 克隆 我一切正常 但是 我想按updated at字段 升序 正如您从 tweet controller 中看到的 我尝试过使用 order by 子句 但这
  • 打造 ecto 独一无二的领域

    如何制作一个字段unique在体外 我以为它和Ruby中的活动记录一样 但似乎不是 你想使用唯一约束 3 http hexdocs pm ecto Ecto Changeset html unique constraint 3 这与 Act
  • 可以用宏获取评论吗?

    我试图解析一些代码并重新格式化它们 但似乎引用只会忽略注释 有什么办法可以实现这一点吗 我想我必须深入 erlang 方面 不 您无法在宏内获取代码注释 它们永远不会成为 AST 的一部分 并且仍然被丢弃在 Elixir 的标记器中
  • Dialyzer 无法识别使用多态类型的函数中的错误

    背景 我正在尝试使用透析器进行多态打字 作为一个例子 我正在使用著名的Option类型 又名 Maybe Monad 现在在许多其他语言中都很流行 defmodule Test do type option t some t nothing
  • 启动混合任务流程依赖项

    Elixir 新手 但到目前为止很喜欢它 我的很多混音任务都依赖于 HTTPotion My mix exs文件被声明为这样 def application do applications logger cowboy plug httpot
  • 如何完全禁用 Elixir/Phoenix 生成器和模型中的上下文?

    凤凰城有一个发电机 mix phx gen html Accounts User users name string age integer 我不想为我的模型使用上下文 也不想提供它的名称 如何禁用它 您仍然可以使用 1 2 及更早版本中的
  • Phoenix 中的 web/static 和 priv/static 有什么区别?

    我对长生不老药和凤凰是新手 现在我在凤凰城的静态资产方面遇到了麻烦 我想在我的页面中添加一个js文件 我在我的模板中添加以下代码 js test js gt gt 然后创建一个js文件web static js test js 但是 我收到
  • 使用 Ansible 将二进制文件添加到 PATH

    我正在尝试安装Kiex https github com taylor kiex版本管理器Elixir http elixir lang org install html使用 Ansible 的编程语言 这些是我为此使用的戏剧 name K

随机推荐

  • PAnsiChar 和 PChar 的区别

    PAnsiChar 和 PChar 之间有区别吗 是什么类型 德尔福2007年之前 先感谢您 D2009 及之后 是的 有 PChar是一个指向 a 的指针Char这是一个 unicode 字符 aWideChar And PAnsiCha
  • 如何启用 PostgreSQL 函数分析器?

    这花了我一段时间才弄清楚 几周前我在一个外语维基上找到了答案 它非常有帮助 所以我想我会分享 在 Win32 上的 PostgreSQL 8 3 上 默认情况下会安装分析插件 但不会加载 只需执行以下 SQL LOAD libdir plu
  • 如何设计轮播点样式?

    我如何将我的旋转木马点设计成这样 这是我现在所拥有的 这是我的风格 slick dots position absolute bottom 45px list style none display block text align cent
  • 在生产 Java 服务器中打开 GC 日志记录是常见做法吗?

    我在一些地方 1 看到人们在生产服务器 关键任务 中启动 GC 日志记录 例如 java server Xms1024m Xmx1024m XX NewSize 256m XX MaxNewSize 256m XX UseConcMarkS
  • 当我点击它们时如何更改圆半径(使用 Three.js)?

    我有以下 JavaScript 代码 取自一个示例 它绘制了一些圆圈 当您单击其中一个圆圈时 它会改变颜色 但我还想在单击该圆圈时更改该圆圈的半径 大小 并保持其他圆圈不变 这文档 https threejs org docs index
  • 如何解码 HTML 实体?

    这是一个 Perl 快速问题 如何转换 HTML 特殊字符 例如 uuml or 039 转换为普通 ASCII 文本 我从这样的事情开始 s d chr 1 eg 并且可以为所有 HTML 字符编写它 但是像这样的函数可能已经存在 请注意
  • 在按下和释放鼠标时绘制矩形,opengl

    我试图根据用户输入绘制一个矩形 该矩形从左键单击收集 x1 y1 坐标 然后从左键单击的释放指定 x2 y2 我成功保存了基于此鼠标操作的坐标 基于确认保存坐标的 cout 这是我尝试过的 请记住 没有任何崩溃 因此存在逻辑错误 void
  • 如何使用 Factorplot 用分类值注释条形或绘制 4 个变量?

    我有一个要绘制的数据框 我想到了两个选择 检查图像 对于选项 1 我需要注释一个分类值 Elec 对于选项 2 我仍然需要使用 factorplot 但我不知道如何修复收到的错误 CODE FOR THE DATAFRAME raw dat
  • Bootstrap 4 有内置水平分隔线吗?

    Bootstrap 4 有内置水平分隔线吗 我可以做这个 但我想使用内置的 bootstrap css 我在文档中找不到它 也许我错过了它 HTML 已经有一个内置的水平分隔符 称为 hr 水平规则 的缩写 Bootstrap 风格像这样
  • 哪些方法可以访问源代码?

    有多种方法可以从需要 加载该库的 Ruby 代码中访问该库的源代码 其中 有的直接读取库文件并解析 其他人通过一些内置方法访问源代码 这些方法提供有关源代码的信息 例如抽象语法树 在我无法直接读取文件内容的情况下 如前面的方式 访问源的唯一
  • 如何使用公共类上的静态变量在活动之间传递数据?

    我试图在公共类上使用静态变量来在活动之间传递它们 我在这样做时遇到了一个罕见的问题 我正在为活动的静态变量赋予值 此活动调用 GLSurfaceView 并监听屏幕方向的变化 如果我为 GLSurfaceView 上的静态变量赋予值 那么一
  • iOS 如何保存录制的音频?

    我正在开发一个应用程序 其中音频被录制并转录为文本 我正在使用 Nuance Developers 提供的 Speechkit 我要添加的功能是 将录制的音频文件保存到永久内存 在表格视图中显示音频文件 稍后加载保存的音频文件 播放音频文件
  • 从 MPEG TS 中提取 PCR 时间值

    我正在尝试从 MPEG TS 数据包中提取 PCR 时间值 根据wiki http en wikipedia org wiki MPEG transport stream PCR 包含 33 6 9 位 并且还指出前 33 位基于 90 k
  • 将文件插入 Google Drive 时出现 IOException

    我在将图像发布到 Google 云端硬盘时遇到以下问题 java io IOException insufficient data written at sun net www protocol http HttpURLConnection
  • locationManager didUpdateLocations 在设备上触发两次,在模拟器上仅触发一次

    相同的代码 我假设设备实际上由于某种原因更新了位置两次 即使我只调用 startUpdatingLocation 一次并且在 didUpdateLocations 内部运行一些 stopUpdatingLocations func loca
  • 如何在 Android Jetpack Compose 中使用字符串资源?

    让我有以下内容strings xml资源文件
  • python中uuid4和秘密token_bytes有什么区别?

    检查了两者的cpython源代码secrets https github com python cpython blob master Lib secrets py and uuid4 https github com python cpy
  • 使用 function-java 向 Java 生产项目添加闭包有多安全?

    我很想在 Java 中使用闭包 我读到过 它们可能会也可能不会进入 Java 7 但是有一个名为函数式java http code google com p functionaljava 已经实现了包括闭包在内的功能特性 在企业生产应用程序
  • 在 group_by() %>% mutate() 函数调用中使用带引号的变量

    可重现的例子 cats lt data frame name c letters 1 10 weight c rnorm 5 10 1 rnorm 5 20 3 type c rep not fat 5 rep fat 5 get mean
  • 在 Elixir 中测试异步代码

    我想测试一个正在使用的函数Task async 为了让我的测试通过 我需要让它在断言之前休眠 100 毫秒 否则测试进程会在执行异步任务之前被终止 有没有更好的办法 编辑 添加代码示例 我想测试的代码 大致 def search param