小编hed*_*sky的帖子

如何避免使用allow_any_instance_of?

想象一下,我们有以下代码:

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)

但是使用这样的方法代码很快就会变得几乎无用的方法(特别是当你在所描述的类中主动使用不同对象的组合时).

ruby rspec rspec-mocks

10
推荐指数
2
解决办法
3961
查看次数

强制执行结构中的所有键

如何在不需要复制所有键的情况下强制执行结构中的所有键?为了澄清,我想干这个:

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)

它工作正常,但看起来很吵.有没有更好的方法?

struct elixir

8
推荐指数
1
解决办法
1177
查看次数

如何在超时后杀死Elixir进程

如何启动Elixir进程,然后在超时后终止它?我有这样的代码:

defmodule OperationsManager do
  def run_operation do
    spawn fn -> 
      # long operation 
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

内部操作可能持续太长时间等待它的结束,所以我需要从管理器中删除该进程.我该怎么做?

编辑:

重要细节:我需要生成几个操作,并且所有操作都应该具有单独的超时.

elixir

3
推荐指数
2
解决办法
2911
查看次数

我可以使用方法而不是常量吗?

使用常量而不是像这样返回这些常量的方法有什么意义吗?

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)

我只能看到第一种方法的一个优点:尝试重新定义常量时发出警告,但我认为这种情况很少见。

ruby

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

标签 统计

elixir ×2

ruby ×2

rspec ×1

rspec-mocks ×1

struct ×1