小编She*_*yar的帖子

混合测试 - 测试模式与任何文件都不匹配

我为我的Elixir项目写了一些测试并将它们放在test/目录中.现在我跑了mix test,我得到:

$ mix test
Test patterns did not match any file: 
Run Code Online (Sandbox Code Playgroud)

就是这样,之后什么都没有.我是否必须手动设置测试路径?快速谷歌搜索没有透露任何信息.


这就是我所有测试的样子:

# project_dir/test/my_app/some_module.exs

defmodule MyApp.SomeModule.Test do
  use ExUnit.Case
  doctest MyApp.SomeModule

  test "method 1" do
    assert MyApp.SomeModule.method_1_works?
  end

  test "method 2" do
    assert MyApp.SomeModule.method_2_works?
  end
end 
Run Code Online (Sandbox Code Playgroud)

elixir-mix elixir

3
推荐指数
1
解决办法
1010
查看次数

Elixir Phoenix模式匹配"params"

在我的具体案例中,我很难理解模式匹配; 我试图params在Phoenix控制器中获取值,我认为这是一个结构.

打字paramsiex的结果

%{"edit" => "93213e66-a15e-11e6-8bc7-38c986312498",
  "job_slug" => "7759-tkhkjd-test"}
Run Code Online (Sandbox Code Playgroud)

但是,运行以下命令:

pry(7)> {edit, job_slug} = params
Run Code Online (Sandbox Code Playgroud)

抛出此错误:

** (MatchError) no match of right hand side value: %{"edit" => "93213e66-a15e-11e6-8bc7-38c986312498", "job_slug" => "7759-tkhkjd-test"}
     (stdlib) :erl_eval.expr/3
Run Code Online (Sandbox Code Playgroud)

如何正确模式匹配params

elixir pattern-matching phoenix-framework

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

在 Elixir 中处理测试和开发 Mnesia 数据库

我正在学习 Elixir,需要一些帮助。我有一个使用的简单应用程序mnesia(暂时不使用Amnesia)。当我开始时,mnesia我会这样做:

:mnesia.create_schema([node()])
:mnesia.create_table(Table, [attributes: [:id, :name]])
:mnesia.start
Run Code Online (Sandbox Code Playgroud)

这将创建一个Mnesia.nonode@nohost目录。我想要的是至少有 2 个不同的数据库,一个用于测试,一个用于开发。我目前正在使用Mix.env. 我计划在我的应用程序每次停止时擦除测试数据库,并在每次启动时创建它(使用startstop方法)。

创建的数据目录mnesia采用 Erlang VM 的名称,这就是为什么我想我需要根据环境(:dev,:test:prod)命名我的 VM 。

这可能吗?这是正确的方法吗?


更新

我知道我可以选择我的 mnesia 数据库数据的存储位置(谢谢 Maryna)。但是当我指定一个“自定义”目录时,我有这种奇怪的行为:

iex(1)> :mnesia.system_info()
===> System info in version {mnesia_not_loaded,nonode@nohost,
                                {1486,66262,472243}}, debug level =  trace <===
opt_disc. Directory     <<"/my/custom/dir">> is NOT used.
use fallback at restart = false
running db nodes   = []
stopped db nodes …
Run Code Online (Sandbox Code Playgroud)

mnesia elixir

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

如何使用Mongodb工作Phoenix Framework?

我正在尝试使用phoenix框架和mongodb作为数据库,所以我运行以下命令来开始

mix phoenix.new helloworld --database mongodb
Run Code Online (Sandbox Code Playgroud)

我的mix.exs文件看起来像这样:

defp deps do
  [{:phoenix, "~> 1.2.1"},
   {:phoenix_pubsub, "~> 1.0"},
   {:phoenix_ecto, "~> 3.0"},
   {:mongodb_ecto, ">= 0.0.0"},
   {:phoenix_html, "~> 2.6"},
   {:phoenix_live_reload, "~> 1.0", only: :dev},
   {:gettext, "~> 0.11"},
   {:cowboy, "~> 1.0"}]
end
Run Code Online (Sandbox Code Playgroud)

但是当我跑步时mix deps.get,我收到以下错误:

Failed to use "ecto" (versions 2.0.0, 2.0.1, 2.0.2, 2.0.3, 2.0.4, 2.0.5, 2.0.6, 2.1.0, 2.1.1, 2.1.2, 2.1.3, 2.1.4) because
  mongodb_ecto (versions 0.1.0 to 0.1.2) requires ~> 1.0
  phoenix_ecto (version 3.0.1) requires ~> 2.0


Failed to use "ecto" (versions …
Run Code Online (Sandbox Code Playgroud)

elixir mongodb ecto phoenix-framework

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

传递并使用Elixir中的命名函数?

以下Elixir代码不正确但传达(我认为)所需的结果:

defmodule Question do
  def dbl(n), do: n * 2
  def trp(n), do: n * 3

  def consumer(xs, f) do
    Enum.filter(xs, f.(x) > 5)
  end
end

Question.consumer([1, 2, 3], dbl) # [3]
Question.consumer([1, 2, 3], trp) # [2, 3]
Run Code Online (Sandbox Code Playgroud)

应如何consumer方法写入消耗dbltrp正确?然后你会怎么称呼它?

谢谢!

编辑:

请问相关问题.你会如何在Elixir中编写和调用下面的Scala代码:

def dbl(n: Int): Int = n * 2
def trp(n: Int): Int = n * 3

def consume(xs: List[Int], f: (Int) => Int): List[Int] =
  xs.filter(x => f(x) > 5)

consume(List(1, …
Run Code Online (Sandbox Code Playgroud)

elixir

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

使用整数键创建映射

我想创建一个带有整数类型键的地图,但这不起作用:

iex(1)> a = %{3: "fdsfd"}
** (SyntaxError) iex:1: unexpected token: ":" (column 8, codepoint U+003A)

iex(1)> a = %{:3 => "fdsfd"}
** (SyntaxError) iex:1: unexpected token: ":" (column 7, codepoint U+003A)
Run Code Online (Sandbox Code Playgroud)

dictionary elixir

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

如何区分16:9显示屏和18:9显示屏?

在我的Android应用中,我使用不同的Android资源目录来支持多种屏幕尺寸和方向。所以在res我里面有一个layout文件夹,一个layout-land文件夹,一个layout-large文件夹,一个layout-large-land文件夹等等。

在我尝试将我的应用安装到具有18:9显示屏而不是显示屏的较新手机中之前,这种方法对我来说非常有效16:9

该电话从layoutlayout-land文件夹中提取资源,这意味着它将被注册为“常规”屏幕。

此外,如果我尝试使用以下代码获取此手机的屏幕尺寸,

int screenSize = getResources().getConfiguration().screenLayout &
                Configuration.SCREENLAYOUT_SIZE_MASK;


        switch(screenSize) {
            case Configuration.SCREENLAYOUT_SIZE_XLARGE:
                Toast.makeText(this, "Extra Large Screen", Toast.LENGTH_LONG).show();
                break;
            case Configuration.SCREENLAYOUT_SIZE_LARGE:
                Toast.makeText(this, "Large Screen", Toast.LENGTH_LONG).show();
                break;
            case Configuration.SCREENLAYOUT_SIZE_NORMAL:
                Toast.makeText(this, "Normal Screen", Toast.LENGTH_LONG).show();
                break;
            case Configuration.SCREENLAYOUT_SIZE_SMALL:
                Toast.makeText(this, "Small Screen", Toast.LENGTH_LONG).show();
                break;
            default:
                Toast.makeText(this, "Screen size is neither xlarge, large, normal or small", Toast.LENGTH_LONG).show();
        }
Run Code Online (Sandbox Code Playgroud)

然后再次将其注册为正常屏幕。但是具有16:9显示屏的手机也是如此。不用说,这在这两款手机上的应用外观上产生了微小但明显的差异。

所以我的问题是,有没有办法区分这两种显示?

注意:我知道有一些解决方法,例如dp …

android screen-orientation android-layout screen-size android-resources

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

Elixir在macOS上使用System运行“ clear”命令

我有一个长生不老药游戏,可以在STDOUT上打印一个“木板”,我想在打印下一个木板版本之前清除屏幕。我检查了长生不老药的文档,我认为这就像调用一样简单,System.cmd("clear", [])但这似乎并不能解决问题:

iex(1)> System.cmd("clear", [])
{"\e[H\e[2J", 0}
Run Code Online (Sandbox Code Playgroud)

似乎返回了一些转义字符,但我不确定这意味着什么。我的问题是为什么没有System.cmd("clear", [])工作?还是我期望它应该清除屏幕错误(以及为什么)?

显然,iex具有clear清除iex的便利功能。我发现此帮助程序方法来自该IEx.Helpers模块,现在我可以运行IEx.Helpers.clear并清除屏幕,然后再打印另一块板。

elixir

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

在 Phoenix 响应中设置 X-Frame-Options

我正在尝试制作一个以为后端的我一直在按照本教程在 Shopify 后台加载我的应用程序,我需要修改x-frame-options标头。

这是我的插头:

@doc false
def init(opts \\ %{}), do: Enum.into(opts, %{})

@doc false
def call(%{params: %{"shop" => shopify_domain}} = conn, _opts) do
  IO.puts("++++++++++ Plug Call ++++++++++++++")
  IO.inspect(shopify_domain)
  # %{"shopify_domain" => shopify_domain_only} = shopify_domain
  shop = ShopifyApp.find_shop_by(shopify_domain)

  allow_shop_or_halt(conn, shop)
end

def call(conn, _opts), do: conn

defp allow_shop_or_halt(conn, nil), do: Conn.halt(conn)

defp allow_shop_or_halt(conn, shop) do
  conn
  |> Conn.put_private(:shop, shop)
  |> Conn.put_resp_header("x-frame-options", "ALLOW-FROM https://#{shop.shopify_domain}/")
end
Run Code Online (Sandbox Code Playgroud)

但 Chrome 浏览器的控制台抱怨说:

加载时遇到无效的“X-Frame-Options”标头.....:ALLOW-FROM https://skbeautysupply.myshopify.com/ '不是可识别的指令。标头将被忽略。

我在这里缺少什么?

elixir x-frame-options phoenix-framework

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

从Ecto数据库中获取随机记录

是否可以仅使用纯Ecto查询从数据库中获取10个随机记录,而不是在应用程序端?例如,我不想从数据库中获取所有记录,然后在Elixir中获取它们的随机值(如下所示):

Subscribers
|> Repo.all
|> Enum.take_random(10)
Run Code Online (Sandbox Code Playgroud)

postgresql elixir ecto

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