Such a simple test fails. But why?

I just tried to integrate a simple test to check some options passed as
argument to a class to be executed:

require 'spec_helper'

module PropertyInjector
  describe Options do
    describe "#source folder option" do
      it "sets up a source folder" do
        argv = %w{-e path/to/some/folder}
        puts "argv[0]: #{argv[0]}"
        puts "argv[1]: #{argv[1]}"
        options = Options.new(argv)
        puts "options.export_folder: #{options.export_folder}"
        options.export_folder.should == argv[1]
      end
    end
  end
end

class Options:

module PropertyInjector
  class Options
def initialize(argv)
      @bundle_folder = DEFAULT_BUNDLE_FOLDER
      @export_folder = DEFAULT_EXPORT_FOLDER
      @import_file_path = File.join(DEFAULT_IMPORT_FOLDER,
EXCEL_FILE_NAME)
      @export = true
      @locales = ['en']
      parse(argv)
    end

    private
def parse(argv)
      OptionParser.new do |opts|
        opts.banner = "Usage: translation properties injector
[options]."

        opts.on("-e [EXPORT_FOLDER]", "--export [EXPORT_FOLDER]",
String, "Path to the export folder to contain a generated Excel file,
(default=#{DEFAULT_EXPORT_FOLDER}") do |folder|
          @export = true
          @export_folder = folder if folder
        end

        opts.on("-i [EXCEL_FILE_PATH]", "--import [EXCEL_FILE_PATH]",
String, "Path to the Excel file to import translations from
(default=#{DEFAULT_IMPORT_FOLDER}/#{EXCEL_FILE_NAME})") do |file_path|
          @export = false
          @import_file_path = file_path if file_path
        end

        opts.on("-b [BUNDLE_FOLDER]", "--bundle [BUNDLE_FOLDER]",
String, "Path to the folder containing properties files,
(default=#{DEFAULT_BUNDLE_FOLDER})") do |folder|
          @bundle_folder = folder if folder
        end

        opts.on("-l [l1,l2,l3]", "--langs [l1,l2,l3]", Array, "Locales
values to use separated by comma, starting from the known one,
default=en") do |langs|
          if langs
            @locales = langs.map(&:downcase)
            @locales.uniq!
          end

        end

        opts.on("-", "--help", "Show this message") do
          puts opts
          exit
        end

        begin
          argv = ["-h"]  if argv.empty?
          opts.parse!(argv)
        rescue OptionParser::ParseError => e
          STDERR.puts e.message, "\n", opts
          exit(1)
        end
      end
    end
  end
end

After running the test, here is what I got:

PropertyInjector::Options
  #source folder option
argv[0]: -e
argv[1]: path/to/some/folder
options.export_folder: path/to/some/folder
    sets up a source folder (FAILED - 1)

Failures:

  1) PropertyInjector::Options#source folder option sets up a source
folder
     Failure/Error: options.export_folder.should == argv[1]
       expected: nil
            got: "path/to/some/folder" (using ==)
     # ./spec/property_injector/options_spec.rb:12:in `block (3 levels)
in <module:PropertyInjector>'

Finished in 0.01562 seconds
1 example, 1 failure

Failed examples:

rspec ./spec/property_injector/options_spec.rb:6 #
PropertyInjector::Options#source folder option sets up a source folder

WHY the second argument is NIL if it WAS NOT before
(path/to/some/folder)?
Thank you in advance.

I found why and shame on me :(((.
The array variable ‘argv’ was passed by reference into the Options class
and was modified there by ‘parse’ method. That’s why, when returned back
to the testing code, the array was nil.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs