想象一下,我们有以下代码:
class A
def create_server
options = {
name: NameBuilder.new.build_name
}
do_some_operations(options)
end
end
Run Code Online (Sandbox Code Playgroud)
为了测试这样的方法,我曾经使用过allow_any_instance_of
:
it 'does operations' do
allow_any_instance_of(NameBuilder).to receive(:build_name)
# test body
end
Run Code Online (Sandbox Code Playgroud)
但是文档建议我们不要使用它,原因有几个.怎么回避allow_any_instance_of
?我只有一个解决方案:
class A
def create_server
options = {
name: builder.build_name
}
do_some_operations
end
private
def builder
NameBuilder.new
end
end
Run Code Online (Sandbox Code Playgroud)
但是使用这样的方法代码很快就会变得几乎无用的方法(特别是当你在所描述的类中主动使用不同对象的组合时).
如何在不需要复制所有键的情况下强制执行结构中的所有键?为了澄清,我想干这个:
defmodule Ticket do
@enforce_keys [:origin, :destination, :price]
defstruct [:origin, :destination, :price]
end
Run Code Online (Sandbox Code Playgroud)
我可以使用其他变量:
defmodule Ticket do
struct_keys = [:origin, :destination, :price]
@enforce_keys struct_keys
defstruct struct_keys
end
Run Code Online (Sandbox Code Playgroud)
它工作正常,但看起来很吵.有没有更好的方法?
如何启动Elixir进程,然后在超时后终止它?我有这样的代码:
defmodule OperationsManager do
def run_operation do
spawn fn ->
# long operation
end
end
end
Run Code Online (Sandbox Code Playgroud)
内部操作可能持续太长时间等待它的结束,所以我需要从管理器中删除该进程.我该怎么做?
编辑:
重要细节:我需要生成几个操作,并且所有操作都应该具有单独的超时.
使用常量而不是像这样返回这些常量的方法有什么意义吗?
class Foo
LETTERS = [:a, :b, :c]
# and them call it Foo::LETTERS
end
# or
class Foo
def self.letters
[:a, :b, :c]
# and then call it Foo.letters, more simplier
end
end
Run Code Online (Sandbox Code Playgroud)
我只能看到第一种方法的一个优点:尝试重新定义常量时发出警告,但我认为这种情况很少见。