I had some Ruby code that utilized File::SEPARATOR and File::PATH_SEPARATOR to run on both unix and windows, so I wanted to stub these values to test for both platforms. There are couple examples out there, building on each other. This example adds a feature that saves and recalls the former value and this example builds on that to support class constants. Both expect Activerecord, so there’s a little working around that added here. I’m ripping this directly from my spec_helper.rb before I throw it away because it feels over-engineered and complicated.
def with_warnings(flag) old_verbose, $VERBOSE = $VERBOSE, flag yield ensure $VERBOSE = old_verbose end # http://missingbit.blogspot.com/2011/07/stubbing-constants-in-rspec_20.html def parse_constant(constant) source, _, constant_name = constant.to_s.rpartition('::') [constantize(source), constant_name] end def with_constants(constants, &block) saved_constants = {} constants.each do |constant, val| source_object, const_name = parse_constant(constant) saved_constants[constant] = source_object.const_get(const_name) with_warnings(nil) {source_object.const_set(const_name, val) } end begin block.call ensure constants.each do |constant, val| source_object, const_name = parse_constant(constant) with_warnings(nil) { source_object.const_set(const_name, saved_constants[constant]) } end end end #################### # File activesupport/lib/active_support/inflector/methods.rb, line 209 def constantize(camel_cased_word) names = camel_cased_word.split('::') names.shift if names.empty? || names.first.empty? constant = Object names.each do |name| constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name) end constant end
Then you can perform:
it "does something when running on Windows" do with_constants "::File::PATH_SEPARATOR" => ";" do # code end end