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不变.
# 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)
看看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)
| 归档时间: |
|
| 查看次数: |
4873 次 |
| 最近记录: |