在 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 中测试异步代码

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

    我有一个 xml 字符串 例如 S b a a b b 我想删除结束标签 b S2 b a a b 我怎样才能实现这个目标 如果您只想删除特定的字符串文字 b 然后获取子列表就可以了 S b a a b b lists sublist S
  • 使用片段的 Ecto“left IN right”查询

    我想使用 postgres IN 运算符 使用 Ecto 库 查询 jsonb 字段 此代码使用简单的 运算符 from a in query where fragment gt gt format a properties foo 但我无
  • 映射到 MySql BIGINT 的 Ecto 或 Elixir 数据类型

    我是 Elixir 和 Phoenix 的新手 学习 6 个月 我有一种情况 我想将 Ecto 模型的字段 不是主键或表 ID 分配给 MySql 中的 BIGINT 我意识到当你创建一个 Ecto 模型时 MySql 表中该模型的 ID
  • 在 Elixir 中部署时更改后端/模块?

    如何实现一个可替换的后端 或基本上任何部分或模块 以便可以在 Elixir 中的配置 部署时进行替换 我的具体情况是一个简单的网络应用程序 在本例中使用 Phoenix 但我猜这个问题也适用于其他情况 我有一个非常简单的后端 使用Agent
  • Ecto迁移中如何动态更新字段值?

    我有一个用户表 例如 email username email protected cdn cgi l email protection email protected cdn cgi l email protection email pr
  • 为什么 Supervisor.start_child 不起作用

    我是 Elixir 的初学者 我有一个应用程序在 application ex 中启动一个自定义主管 代码 defmodule MyApp do use Application def start type args do import S
  • Ecto 构建多个关联

    目前正在使用 Ecto Postgres 从事 Phoenix 项目 创建评论时 作为评论belongs to用户和文章 有没有一种方法可以构建多个关联来生成一个变更集 像这样的伪代码 comment changeset build ass
  • Elixir / Erlang Dialyzer:为什么行为回调的参数类型应该是子类型而不是超类型?

    我有一个行为 X 和一个参数类型的回调函数 a any 模块 Y 实现行为 X 实现模块 Y 中的回调函数具有参数类型 a any b any Dialyzer 不喜欢这样并抱怨 a b gt is not a supertype of a
  • GenServer 正常关闭

    我使用 GenServer 编写了一个 Elixir 应用程序 该应用程序在启动时启动外部应用程序 然后将其关闭 并在退出时进行其他清理 我在中添加了启动功能init 1 https hexdocs pm elixir GenServer
  • 启动混合任务流程依赖项

    Elixir 新手 但到目前为止很喜欢它 我的很多混音任务都依赖于 HTTPotion My mix exs文件被声明为这样 def application do applications logger cowboy plug httpot
  • 如何在 Elixir 或 Phoenix 框架中安排代码每隔几个小时运行一次?

    假设我想每 4 小时发送一堆电子邮件或重新创建站点地图或其他任何内容 我该如何在 Phoenix 或仅使用 Elixir 做到这一点 有一个简单的替代方案 不需要任何外部依赖项 defmodule MyApp Periodically do
  • Ecto 中按日期时间查询

    这是我尝试过的 date Ecto DateTime from erl calendar universal time query gt where record record deadline gt date 我也尝试过 date Ect
  • Phoenix 编程:未定义函数 page_path/2

    我的网络应用程序遇到问题 出现以下编译错误 Compilation error on file web controllers auth ex CompileError web controllers auth ex 49 undefine
  • 使用 Elixir 生成首字母头像 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在开发 Elixir 并希望提供头像服务 如果用户没有头像 可以制作一个带有他们姓名首字母缩写的头像 如下所示 我真的不知道从哪里
  • 预加载所有关系

    我有一个与此类似的 ERM ModelA ModelB ModelC 我得到模型及其模型如下 modela Repo get ModelA 1 modela preload modela modelb 现在我可以访问ModelBs with
  • Elixir 中的多行注释

    大多数语言都允许块注释和多行命令 例如 HTML 中的多行注释如下所示 在 Elixir 中 我发现的最接近的东西来自 EEx docs https hexdocs pm eex EEx html EEx智能引擎似乎从源中被丢弃 即使它们是
  • 类型不匹配插入:binary_id 与 Ecto 变更集

    我有一张桌子applications有外键user id这是一个 Postgresuuid 我在我的web ex primary key id binary id autogenerate true foreign key type bin
  • 使用 gitbash 和 elixir 在 vscode 中输出垃圾而不是颜色

    我开始学习elixir并成功让iex有ansi颜色 问题是在 vscode 的终端中 输出看起来像垃圾 iex Interactive Elixir 1 8 1 press Ctrl C to exit type h ENTER for h
  • 让 Ecto 查询更高效

    我正在尝试查看当前用户的团队是否与传入的用户团队重叠 我有一些有用的东西 但我很好奇它是否能让我更有效率 这是我所拥有的 user teams from t in MyApp Team left join a in assoc t acco

随机推荐

  • 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