如何测试Singleton类?

bra*_*fck 11 ruby testing singleton rspec

我正在使用RSpec并且想要多次测试Singleton类的构造函数.

我怎样才能做到这一点?

最好的祝福

Cam*_*tin 17

Singleton类基本上是这样做的

def self.instance
  @instance ||= new
end

private_class_method :new
Run Code Online (Sandbox Code Playgroud)

所以你可以通过使用send调用private方法来完全绕过memoization

let(:instance) { GlobalClass.send(:new) }
Run Code Online (Sandbox Code Playgroud)

这种方式的一个很好的好处是,由于测试运行,没有修改全局状态.


这个答案可能是一个更好的方法:

let(:instance) { Class.new(GlobalClass).instance }
Run Code Online (Sandbox Code Playgroud)

这将创建一个继承自的GlobalClass所有类级实例变量的匿名类.然后在每次测试后抛弃它,保持GlobalClass不变.


Pan*_*nic 7

# singleton_spec.rb
require "singleton"

class Global
  include Singleton

  def initialize
    puts "Initializing"
  end
end

describe Global do
  before do
    Singleton.__init__(Global)
  end

  it "test1" do
    Global.instance
  end

  it "test2" do
    Global.instance
  end
end


% rspec singleton_spec.rb -fd
Global
Initializing
  test1
Initializing
  test2
Run Code Online (Sandbox Code Playgroud)


Nic*_*ing 3

看看http://blog.ardes.com/2006/12/11/testing-singletons-with-ruby

require 'singleton'

class <<Singleton
  def included_with_reset(klass)
    included_without_reset(klass)
    class <<klass
      def reset_instance
        Singleton.send :__init__, self
        self
      end
    end
  end
  alias_method :included_without_reset, :included
  alias_method :included, :included_with_reset
end
Run Code Online (Sandbox Code Playgroud)