我想测试一个正在使用的函数 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) 我希望在凤凰应用程序旁边反复运行相同的操作序列(当然,如果某些东西在工作者中刹车,则不会崩溃整个网络应用程序)并且我真的不知道我应该使用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的东西,并希望你们中的某些人可以帮助我在这里绊倒正确的方向.
在Phoenix框架中处理关联和嵌套表单的方法是什么?如何创建具有嵌套属性的表单?如何在控制器和模型中处理它?
在编写依赖于当前日期/时间的集成测试时,能够freeze或travel特定时刻(例如rubc的timecop)非常方便
有没有办法在Elixir/Erlang中实现类似的东西?
我试图嘲弄二郎内置插件:os.timestamp,:erlang.universaltime使用meck图书馆,但它失败:cannot_mock_builtin.
原则上我可以实现自己的实用程序库,而不是简单地模拟当前时间,然后在任何地方使用它而不是内置方法; 但是,有些库使用内置函数,因此这不是一个可行的选项(例如Ecto.Model.Timestamps,生成inserted_at和updated_at值)
我有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中,您可以获得字符串的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项目.如何从正在运行的应用程序中访问它.
在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) 我目前的解决方案是运行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?
在新的Programming Phoenix书中,Chris McCord说这是关于使用字符串和原子键来控制器动作参数:
在我们控制器的world动作中,外部参数有字符串键,"name"=> name,而在内部我们使用name:name.这是整个凤凰城遵循的惯例.外部数据是不安全的,所以我们明确匹配的字符串键,然后我们的应用程序边界像控制器和渠道将它们转换成原子键,我们将依靠其他地方里面凤凰.
但是,我不清楚为什么使用字符串键比原子键更安全.为什么字符串键在这里更安全?
我最近决定学习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中起作用?