标签: elixir

在elixir单元测试中导入测试代码

我正在编写一些与SSH交互的Elixir代码的测试.在我的测试中,我想启动一个SSH服务器,我可以运行我的代码.我更喜欢将此代码存储在测试目录中的自己的文件中,并通过各种不同的测试导入它.

尽管如此,我还是无法让它工作得太好.

我已经尝试创建一个test/ssh_server.ex包含SSHServer模块的文件,但是当我添加import SSHServer到我的测试中时,我得到:

(CompileError)test/end_to_end_test.exs:13:模块SSHServer未加载,无法找到

我错过了什么吗?有没有办法强制mix test导入我的test/ssh_server.ex文件?

elixir-mix elixir

13
推荐指数
1
解决办法
2896
查看次数

在凤凰城的Rails'fore_filter等价物

我刚刚开始研究我的第一个凤凰应用程序,问题是我的控制器中的每个操作都有一些共同的代码行,我想分开.他们从多个Ecto模型中获取数据并将其保存到变量中以供使用.

在Rails中,我可以简单地定义一个方法并before_filter在我的控制器中调用它.我可以从一个访问结果@variable.我知道使用Plugs是关键,但我不知道如何实现这一点,更具体地说:

  • 访问params来自的请求Plug
  • 并使变量在动作中可访问

作为参考,这是我正在尝试做的rails版本:

class ClassController < ApplicationController
    before_filter :load_my_models

    def action_one
        # Do something with @class, @students, @subject and @topics
    end

    def action_two
        # Do something with @class, @students, @subject and @topics
    end

    def action_three
        # Do something with @class, @students, @subject and @topics
    end

    def load_my_models
        @class    = Class.find    params[:class_id]
        @subject  = Subject.find  params[:subject_id]

        @students = @class.students
        @topics   = @subject.topics
    end
end
Run Code Online (Sandbox Code Playgroud)

谢谢!

ruby-on-rails elixir phoenix-framework

13
推荐指数
1
解决办法
2676
查看次数

有没有办法在Elixir的函数中注释掉代码行

有没有办法在函数中注释掉一行或多行代码?

类似以下内容

defmodule MyModule
  def foo do
    //a = "old code"
    a = "new code"
  end
end
Run Code Online (Sandbox Code Playgroud)

要么

defmodule MyModule
  def foo do
    /*a = "old code"
    b = 1234 */
    a = "new code"
  end
end
Run Code Online (Sandbox Code Playgroud)

elixir

13
推荐指数
1
解决办法
5767
查看次数

Elixir Stream中的Task.async

我想在一个大清单上做一个平行地图.代码看起来有点像这样:

big_list
|> Stream.map(&Task.async(Module, :do_something, [&1]))
|> Stream.map(&Task.await(&1))
|> Enum.filter filter_fun
Run Code Online (Sandbox Code Playgroud)

但是我正在检查Stream实现,据我所知,它Stream.map结合了函数并将组合函数应用于流中的元素,这意味着序列是这样的:

  1. 拿第一个元素
  2. 创建异步任务
  3. 等待它完成
  4. 采取第二个elelemnt ...

在这种情况下,它不会并行执行.我是对的还是我错过了什么?

如果我是对的,那么这段代码呢?

Stream.map Task.async ...
|> Enum.map Task.await ...
Run Code Online (Sandbox Code Playgroud)

这是否会并行运行?

parallel-processing elixir

13
推荐指数
2
解决办法
4948
查看次数

如何在Elixir中获得与Ecto的"belongs_to"关联?

我有一个帖子和评论模型.一篇帖子有很多评论,一篇评论属于帖子.

在显示个人评论时,如何访问其所属的帖子?

即在Ruby on Rails中你可以做到:

@comment = Comment.find(params[:id])
@post = @comment.post
Run Code Online (Sandbox Code Playgroud)

我怎样才能使用Phoenix Elixir框架实现这一目标?我相信我已正确设置了模型关联,但我对如何在视图或控制器中实际获取此查询感到困惑.

elixir ecto phoenix-framework

13
推荐指数
1
解决办法
6863
查看次数

正确的Elixir OTP方式来构建重复任务

我有一个工作流程,涉及每30秒左右醒来并轮询一个数据库以获取更新,对此采取行动,然后再回到睡眠状态.撇开数据库轮询不会扩展和其他类似问题,使用主管,工作人员,任务等构建此工作流的最佳方法是什么?

我将列出一些我已经拥有的想法和我的想法/反对.请帮我弄清楚Elixir-y最方法.(顺便说一句,我对Elixir还很新.)

1.无限循环通过函数调用

只需在其中放入一个简单的递归循环,如下所示:

def do_work() do
  # Check database
  # Do something with result
  # Sleep for a while
  do_work()
end
Run Code Online (Sandbox Code Playgroud)

阅读有关构建网络爬虫教程时,我看到了类似的内容.

我在这里遇到的一个问题是由于递归导致的无限堆栈深度.这会不会导致堆栈溢出,因为我们在每个循环结束时递归?这个结构用于任务的标准Elixir指南,所以我可能错误的堆栈溢出问题.

更新 - 如答案中所述,Elixir中的尾调用递归意味着堆栈溢出在这里不是问题.在最后调用自己的循环是一种可接受的无限循环方式.

2.使用任务,每次重启

这里的基本思想是使用运行一次然后退出的Task,但是将它与具有one-to-one重启策略的Supervisor配对,以便每次完成后重新启动.任务检查数据库,休眠,然后退出.主管看到出口并开始新的出口.

这有利于住在主管内部,但这似乎是滥用主管.除了错误捕获和重新启动之外,它还用于循环.

(注意:使用Task.Supervisor可能还有其他一些功能,而不是普通的Supervisor,而我只是不理解它.)

3.任务+无限递归循环

基本上,将1和2组合在一起,因此它是一个使用无限递归循环的Task.现在它由Supervisor管理,如果崩溃将重新启动,但不会作为工作流的正常部分反复重启.这是目前我最喜欢的方法.

4.其他?

我担心的是,我缺少一些基本的OTP结构.例如,我熟悉Agent和GenServer,但最近我偶然发现了Task.也许正是这种情况下有某种Looper,或者是Task.Supervisor的一些用例.

elixir erlang-otp

13
推荐指数
2
解决办法
4619
查看次数

Elixir ecto 2创建了many_to_many关联

如何与ecto 2建立多对多关系?作为一个示例应用程序,我想创建一个可以在多个类别中的帖子.这些类别已经存在.例如:

[%Category{id: "1", name: "elixir"}, %Category{id: "2", name: "erlang"}]
Run Code Online (Sandbox Code Playgroud)

我正在使用Ecto 2 beta 0.示例项目名为Ecto2.

我定义了两个模型:

defmodule Ecto2.Post do
  use Ecto2.Web, :model
  use Ecto.Schema

  schema "posts" do
    field :title, :string
    many_to_many :categories, Ecto2.Category, join_through: "posts_categories", on_replace: :delete
    timestamps
  end

  @required_fields ~w(title)
  @optional_fields ~w()
  def changeset(model, params \\ :empty) do
    model
    |> cast(params, @required_fields, @optional_fields)
    |> cast_assoc(:categories)  # not suitable?
  end
end

defmodule Ecto2.Category do
  use Ecto2.Web, :model

  schema "categories" do
    field :name, :string

    timestamps
  end

  @required_fields ~w(name)
  @optional_fields ~w()
  def changeset(model, …
Run Code Online (Sandbox Code Playgroud)

elixir ecto phoenix-framework

13
推荐指数
1
解决办法
4922
查看次数

Elixir/ExUnit:可以将上下文从测试用例传递到拆解/清理方法(on_exit)吗?

问题

我想测试一个与主机系统交互的Elixir模块,并且具有副作用的方法.对于这个问题并保持简短,假设它是几个目录的创建.这些目录当然应该在运行测试后删除,如果测试(很长时间)由于任何原因(坏的模块代码,错误的测试代码等)而失败.

我想知道如何最好/最优雅地解决这个清理步骤.我查看了ExUnit.Callbacks.on_exit/2的文档,但它的示例仅用于设置和简单拆解(不涉及传递状态).我也在线搜索,但没有发现任何有用的东西,所以可能是我的想法本身并不好 - 我也愿意接受重构问题的建议.

defmodule SimpleTest do
  use ExUnit.Case

  setup_all do
    ts = Time.utc_now |> Time.to_string
    {:ok, [timestamp: ts]}
    # paths to be cleaned are not yet known here
  end

  test "first test", context do
    path = "/tmp/dir" <> context[:timestamp]
    assert :ok == SimpleModule.mkdir(path)
    assert :eexist == SimpleModule.mkdir(path)
    # [path] should be passed on to cleanup
  end

  test "second test", context do
    path = "/tmp/dir" <> context[:timestamp]
    path2 = "/tmp/dir2" <> context[:timestamp]
    SimpleModule.mkdir(path)
    SimpleModule.mkdir(path2)
    assert File.exists?(path) …
Run Code Online (Sandbox Code Playgroud)

unit-testing functional-programming elixir teardown ex-unit

13
推荐指数
1
解决办法
1718
查看次数

Elixir - 如何每3个字符将字符串拆分为一个列表

如果我有字符串"UGGUGUUAUUAAUGGUUU"怎么把它变成一个列表,每3个字符分成一个["UGG", "UGU", "UAU", "UAA", "UGG", "UUU"]

elixir

13
推荐指数
5
解决办法
5254
查看次数

Elixir混合文件 - :应用程序vs:extra_applications - 何时使用哪个?

来自Elixir文档:

:applications - 应用程序在运行时依赖的所有应用程序.默认情况下,此列表是从依赖项中自动推断出来的.必须在中指定任何额外的Erlang/Elixir依赖项:extra_applications.混合和其他工具使用应用程序列表,以便在启动应用程序本身之前启动依赖项.

:extra_applications - 您希望在应用程序之前启动的Erlang/Elixir应用程序列表.例如,Elixir :logger或Erlang的:crypto.

如果:applications自动推断列表,那么在我们应该添加应用程序:applications而不是:extra_applications?时,有哪些示例场景?反之亦然?

elixir

13
推荐指数
1
解决办法
1717
查看次数