"Joey Geiger" <[EMAIL PROTECTED]> writes: > I'm running into an issue while trying to test the execution of some > external applications called from inside my models. > > class OmssaPacker > def self.run_omssa_aws2ez2_unix(parameters) > system("perl /pipeline/vipdac/lib/omssa_aws2ez2_unix.pl #{parameters}") > end > end > > ..spec code... > describe "run omssa aws2ez2 unix" do > it "should run the perl file" do > > Kernel.should_receive(:system).with(/omssa_aws2ez2_unix\.pl/).and_return(true) > OmssaPacker.run_omssa_aws2ez2_unix("file").should be_true > end > end > ...spec code... > > Returns: > should run the perl file > Mock 'Module' expected :system with (/omssa_aws2ez2_unix\.pl/) once, > but received it 0 times > > And it also actually attempts to run the perl script, since I can see > the output in the window. If I change the code to: > > def self.run_omssa_aws2ez2_unix(parameters) > %x{ perl /pipeline/vipdac/lib/omssa_aws2ez2_unix.pl #{parameters} } > end > > ...spec code... > describe "run omssa aws2ez2 unix" do > it "should run the perl file" do > > Kernel.should_receive(:`).with(/omssa_aws2ez2_unix\.pl/).and_return(true) > OmssaPacker.run_omssa_aws2ez2_unix("file").should be_true > end > end > ...spec code... > > Returns: > should run the perl file > expected true, got ""Program: omssa_aws2ez2.pl ...output from perl > program about command line options..." > > It seems that the attempts to mock Kernel are being ignored and it's > just running the scripts anyway. I'm guessing that I'm setting up the > mock incorrectly, but I'm not sure how. > > I've also tried Kernel.stub!(:system).and_return(true) with the same results. > _______________________________________________ > rspec-users mailing list > rspec-users@rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users
Hi Joey, In Ruby, any time you send a message without an explicit receiver, the message has an implicit receiver of 'self'. So from this we can infer that you don't want to stub Kernel#system, but rather OmssaPacker.system. The other side of the coin for understanding this is that while the method is defined in Kernel, it's not defined ON Kernel. Kernel is a module that's mixed into Object, so its methods are defined on all Objects. Kernel.should_receive(:system).with(/omssa_aws2ez2_unix\.pl/).and_return(true) is what you're looking for. Pat _______________________________________________ rspec-users mailing list rspec-users@rubyforge.org http://rubyforge.org/mailman/listinfo/rspec-users