标签: elixir

在Elixir中测试异步代码

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

为了使我的测试通过,我需要让它在断言前保持100ms睡眠,否则测试过程在异步任务执行之前被杀死.

有没有更好的办法?

编辑,添加代码示例:

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

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
Run Code Online (Sandbox Code Playgroud)

我已经写过的测试(仅用于调用睡眠)

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
Run Code Online (Sandbox Code Playgroud)

elixir

20
推荐指数
2
解决办法
4391
查看次数

我应该使用哪种OTP行为来"无休止"重复任务?

我希望在凤凰应用程序旁边反复运行相同的操作序列(当然,如果某些东西在工作者中刹车,则不会崩溃整个网络应用程序)并且我真的不知道我应该使用GenServer,Elixir的任务,代理人或者我到目前为止没有想过的完全不同的东西.

当我启动我的凤凰应用程序时,工作人员也应该启动,定期拉出一些串行连接值,通过凤凰频道广播它们,收集它们直到@save_interval达到然后计算中位数,通过不同的频道广播中位数和将它写入InfluxDB.现在我有这样的东西(有点工作):

def do_your_thing(serial_pid) do
  Stream.interval(@interval_live)
    |> get_new_values_from_serial(serial_pid)
    |> broadcast!("live-channel:#{@name}")
    |> Enum.take(div(@interval_save, @interval_live))
    |> calculate_medians()
    |> broadcast!("update-channel:#{@name}")
    |> write_to_database()

  do_your_thing(serial_pid) # repeat
end
Run Code Online (Sandbox Code Playgroud)

我只是开始想出所有OTP的东西,并希望你们中的某些人可以帮助我在这里绊倒正确的方向.

elixir erlang-otp phoenix-framework

20
推荐指数
1
解决办法
1856
查看次数

如何在Phoenix框架中处理关联和嵌套表单?

在Phoenix框架中处理关联和嵌套表单的方法是什么?如何创建具有嵌套属性的表单?如何在控制器和模型中处理它?

elixir ecto phoenix-framework

20
推荐指数
1
解决办法
6692
查看次数

Elixir的时间旅行和时间冻结

在编写依赖于当前日期/时间的集成测试时,能够freezetravel特定时刻(例如rubc的timecop)非常方便

有没有办法在Elixir/Erlang中实现类似的东西?

我试图嘲弄二郎内置插件:os.timestamp,:erlang.universaltime使用meck图书馆,但它失败:cannot_mock_builtin.

原则上我可以实现自己的实用程序库,而不是简单地模拟当前时间,然后在任何地方使用它而不是内置方法; 但是,有些库使用内置函数,因此这不是一个可行的选项(例如Ecto.Model.Timestamps,生成inserted_atupdated_at值)

erlang mocking elixir

20
推荐指数
1
解决办法
2448
查看次数

Ecto删除引用的数据库记录

我有2张桌子:

用户:

id
username
password

unique_index username

(the schema has a has_many other)
Run Code Online (Sandbox Code Playgroud)

其他:

id
user_id - references(:users)
foo

index user_id

(the schema has a belongs_to user)
Run Code Online (Sandbox Code Playgroud)

在"其他"的变更集中,我有这个

model
|> cast(params, @req, @opt)
|> foreign_key_constraint(:user_id)
Run Code Online (Sandbox Code Playgroud)

我在这一点上的假设是"其他"ecto模型需要一个"用户"与它相关联才能存在(这就是我想要的)

但我的第二个假设是,如果我删除"用户"记录,那么所有关联的"其他"记录将被删除(通过级联删除)

实际发生的是我在尝试删除"用户"记录时有一个Ecto.ConstraintError(我假设因为有一个与该用户关联的"其他"记录)

那么我将如何以我想要的方式工作呢:

  • "用户"可以独立创建
  • 可以创建"其他"但必须属于"用户"
  • 当删除"其他"时,它不会影响任何其他内容
  • 删除"用户"时,它也会删除所有关联的"其他"记录

对于引用它的任何项目,基本上是用户级联删除

elixir ecto

20
推荐指数
2
解决办法
8830
查看次数

在Elixir中哈希MD5

在Elixir中,您可以获得字符串的md5:

ex(1)> :crypto.hash(:md5 , "Elixir") |> Base.encode16()
"A12EB062ECA9D1E6C69FCF8B603787C3"
Run Code Online (Sandbox Code Playgroud)

但为什么不从终端返回相同的值?

[~ ~]$echo 'Elixir' | md5
694f56f4b30e60837151723777795fc2
Run Code Online (Sandbox Code Playgroud)

当然我错过了什么.

elixir

20
推荐指数
1
解决办法
6278
查看次数

在elixir应用程序中访问项目版本

我有一个定义版本的elixir项目.如何从正在运行的应用程序中访问它.

在mix.exs中

  def project do
    [app: :my_app,
     version: "0.0.1"]
  end
Run Code Online (Sandbox Code Playgroud)

我想在应用程序中访问此版本号,以便我可以将其添加到返回的消息中.我在env哈希中寻找一些东西,如下所示

__ENV__.version
# => 0.0.1
Run Code Online (Sandbox Code Playgroud)

elixir erlang-otp

19
推荐指数
4
解决办法
4489
查看次数

如何减少Elixir中的索引?

我目前的解决方案是运行with_index然后reduce在阵列上运行.

5..10 
|> Stream.with_index 
|> Enum.reduce(0, fn(num_idx, acc) ->
     {num, idx} = num_idx
     acc + num * idx
   end)
Run Code Online (Sandbox Code Playgroud)

是否有方法将元素的索引附加到元素,然后在数组上运行reduce?

elixir

19
推荐指数
3
解决办法
6443
查看次数

Phoenix中的原子键与字符串键

在新的Programming Phoenix书中,Chris McCord说这是关于使用字符串和原子键来控制器动作参数:

在我们控制器的world动作中,外部参数有字符串键,"name"=> name,而在内部我们使用name:name.这是整个凤凰城遵循的惯例.外部数据是不安全的,所以我们明确匹配的字符串键,然后我们的应用程序边界像控制器和渠道将它们转换成原子键,我们将依靠其他地方里面凤凰.

但是,我不清楚为什么使用字符串键比原子键更安全.为什么字符串键在这里更安全?

elixir phoenix-framework

19
推荐指数
1
解决办法
2009
查看次数

在Elixir中返回值?

我最近决定学习Elixir.来自C++/Java/JavaScript背景,我在掌握基础知识方面遇到了很多麻烦.这可能听起来很愚蠢,但返回语句如何在Elixir中起作用?我环顾四周,好像它只是一个函数的最后一行,即

def Hello do 
  "Hello World!"
end
Run Code Online (Sandbox Code Playgroud)

这个函数会返回"Hello World!",还有另一种方法可以返回吗?另外,你怎么会早点回来?在JavaScript中,我们可以编写类似这样的内容来查找数组中是否有某个值:

function foo(a){
   for(var i = 0;i<a.length;i++){
      if(a[i] == "22"){
         return true;
      }
   }
   return false;
}
Run Code Online (Sandbox Code Playgroud)

如何在Elixir中起作用?

function elixir

19
推荐指数
2
解决办法
1万
查看次数

标签 统计

elixir ×10

phoenix-framework ×3

ecto ×2

erlang-otp ×2

erlang ×1

function ×1

mocking ×1