我为我的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) 在我的具体案例中,我很难理解模式匹配; 我试图params在Phoenix控制器中获取值,我认为这是一个结构.
打字params中iex的结果
%{"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,需要一些帮助。我有一个使用的简单应用程序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. 我计划在我的应用程序每次停止时擦除测试数据库,并在每次启动时创建它(使用start和stop方法)。
创建的数据目录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) 我正在尝试使用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代码不正确但传达(我认为)所需的结果:
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方法写入消耗dbl和trp正确?然后你会怎么称呼它?
谢谢!
编辑:
请问相关问题.你会如何在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) 我想创建一个带有整数类型键的地图,但这不起作用:
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) 在我的Android应用中,我使用不同的Android资源目录来支持多种屏幕尺寸和方向。所以在res我里面有一个layout文件夹,一个layout-land文件夹,一个layout-large文件夹,一个layout-large-land文件夹等等。
在我尝试将我的应用安装到具有18:9显示屏而不是显示屏的较新手机中之前,这种方法对我来说非常有效16:9。
该电话从layout和layout-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
我有一个长生不老药游戏,可以在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并清除屏幕,然后再打印另一块板。
我正在尝试制作一个以phoenix-framework为后端的shopify应用程序。我一直在按照本教程在 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/ '不是可识别的指令。标头将被忽略。
我在这里缺少什么?
是否可以仅使用纯Ecto查询从数据库中获取10个随机记录,而不是在应用程序端?例如,我不想从数据库中获取所有记录,然后在Elixir中获取它们的随机值(如下所示):
Subscribers
|> Repo.all
|> Enum.take_random(10)
Run Code Online (Sandbox Code Playgroud) elixir ×9
ecto ×2
android ×1
dictionary ×1
elixir-mix ×1
mnesia ×1
mongodb ×1
postgresql ×1
screen-size ×1