# Unit-test ARGV problem (only 1 of 3 tests is using it)

**URL:** <https://www.ruby-forum.com/t/unit-test-argv-problem-only-1-of-3-tests-is-using-it/91944>\
**Category:** Ruby\
**Created:** [April 13, 2007, 6:13pm UTC](https://www.ruby-forum.com/t/unit-test-argv-problem-only-1-of-3-tests-is-using-it/91944 "2007-04-13T18:13:52Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![ChrisKaelin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/b2d939/32.png) [@ChrisKaelin](https://www.ruby-forum.com/u/ChrisKaelin)\
**Post date:** [April 13, 2007, 6:13pm UTC](https://www.ruby-forum.com/t/unit-test-argv-problem-only-1-of-3-tests-is-using-it/91944/1 "2007-04-13T18:13:52Z")

</div>

I have 3 tests using the following setup routine, that is faking  
command line arguments via ARGV.  
Only one of my 3 test routines seems to be actually using the ARGV  
defined here (but the @run1 seems to be initialized, so I know at  
least, the setup routine is called by each test). Am I missing  
anything? I thought the setup routine is called for every test?

def setup  
# faking commandline arguments first  
# no space here or the space will be  
# part of the filenames 😉  
if RUBY\_PLATFORM =~ /mswin32/  
#ARGV[1] = “-h”  
ARGV[1] = “-ltestlogfile”  
ARGV[2] = “-cdefault\_config.yml”  
ARGV[3] = “-pC:\TEMP”  
ARGV[4] = “-L4”  
ARGV[5] = “-v”  
else  
ARGV[1] = “-ltestlogfile”  
ARGV[2] = “-cdefault\_config.yml”  
ARGV[3] = “-p/tmp”  
end  
@run1 = TheScript.new  
@run1.set\_vars  
end

---

<div class="post-metadata">

**Author:** ![ChrisKaelin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/b2d939/32.png) [@ChrisKaelin](https://www.ruby-forum.com/u/ChrisKaelin)\
**Post date:** [April 14, 2007, 12:40am UTC](https://www.ruby-forum.com/t/unit-test-argv-problem-only-1-of-3-tests-is-using-it/91944/2 "2007-04-14T00:40:32Z")

</div>

So far I can only say, it has nothing to do with the environment I  
use. Also it does not matter wether I give the ARGV values in the  
setup routine or give it to the test script directly by commandline…

---

<div class="post-metadata">

**Author:** ![ChrisKaelin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/b2d939/32.png) [@ChrisKaelin](https://www.ruby-forum.com/u/ChrisKaelin)\
**Post date:** [April 14, 2007, 12:44am UTC](https://www.ruby-forum.com/t/unit-test-argv-problem-only-1-of-3-tests-is-using-it/91944/3 "2007-04-14T00:44:33Z")

</div>

On Apr 13, 2007, at 09:10 , ChrisKaelin wrote:

> I have 3 tests using the following setup routine, that is faking  
> command line arguments via ARGV.  
> Only one of my 3 test routines seems to be actually using the ARGV  
> defined here (but the @run1 seems to be initialized, so I know at  
> least, the setup routine is called by each test). Am I missing  
> anything? I thought the setup routine is called for every test?

setup IS called for every test.

> ```
> ARGV[5] = "-v"
> else
> ARGV[1] = "-ltestlogfile"
> ARGV[2] = "-cdefault_config.yml"
> ARGV[3] = "-p\/tmp"
> end
> @run1 = TheScript.new
> @run1.set_vars
> 
> ```
> 
> end

Try this instead:

def setup  
ARGV.clear  
ARGV.push("-ltestlogfile", “-cdefault\_config.yml”)  
if RUBY\_PLATFORM =~ /mswin32 then  
ARGV.push("-pC:\TEMP", “-L4”, “-v”)  
else  
ARGV.push("-p/tmp")  
end  
end

I think the main problem is that ARGV is zero based and you’re not  
respecting that by manually placing the elements in.

---

<div class="post-metadata">

**Author:** ![ChrisKaelin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/b2d939/32.png) [@ChrisKaelin](https://www.ruby-forum.com/u/ChrisKaelin)\
**Post date:** [April 14, 2007, 12:52am UTC](https://www.ruby-forum.com/t/unit-test-argv-problem-only-1-of-3-tests-is-using-it/91944/4 "2007-04-14T00:52:33Z")

</div>

On Apr 13, 2007, at 15:45 , ChrisKaelin wrote:

> Found it…  
> I used  
> opts.parse!(args)  
> as from the example from rdoc of OptionParser. Instead I should have  
> used:  
> opts.parse(args)  
> which does not pop the ARGV values.

Popping the args should be fine as long as you put them back. In  
fact, I’d say it is better because you can guarantee what you’re  
dealing with. Start with ARGV.clear and put what you want in it each  
time through.

---

<div class="post-metadata">

**Author:** ![ChrisKaelin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/b2d939/32.png) [@ChrisKaelin](https://www.ruby-forum.com/u/ChrisKaelin)\
**Post date:** [April 17, 2007, 1:15am UTC](https://www.ruby-forum.com/t/unit-test-argv-problem-only-1-of-3-tests-is-using-it/91944/5 "2007-04-17T01:15:58Z")

</div>

On 14 Apr., 00:44, Ryan D. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > ```
> > ARGV[3] = "-pC:\\TEMP"
> > 
> > ```
> 
> end
> 
> I think the main problem is that ARGV is zero based and you’re not  
> respecting that by manually placing the elements in.

Yeah, probably that was why it only worked one round… I will try  
your solution, so I can go back to use the correct way of the options  
parse. Thanks a lot!

---

<div class="post-metadata">

**Author:** ![ChrisKaelin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/b2d939/32.png) [@ChrisKaelin](https://www.ruby-forum.com/u/ChrisKaelin)\
**Post date:** [April 14, 2007, 12:46am UTC](https://www.ruby-forum.com/t/unit-test-argv-problem-only-1-of-3-tests-is-using-it/91944/6 "2007-04-14T00:46:33Z")

</div>

Found it…  
I used  
opts.parse!(args)  
as from the example from rdoc of OptionParser. Instead I should have  
used:  
opts.parse(args)  
which does not pop the ARGV values.
