The tests for pvn raise an interesting question to me. The pvn subcommands that wrap/extend the svn subcommands process the svn output, so the tests need svn output to run.
I’ve considered doing mock objects for svn, but that became confounding, where I was essentially mocking all of the svn subcommands that I need. So I’m leaning in the direction of doing operations against a “real” Subversion repository. On a 234M Subversion repository, it takes around 0.4 seconds to do a backup (cp -r), when both the source and the target locations are on the SSD in my machine.
So it’s feasible for the test sequence to be:
- back up the svn repository (0.4 seconds)
- check out the svn repository checked out to working copy (4 seconds)
- working copy modified, with added, changed and deleted files and directories (< 10 seconds for all tests)
- svn repository restored to backed up version (1 second)
I’m still considering how to go about this, but in the meantime I’ve written the following for adding suite-wide setup and teardown for the pvn base testcase. Note that this is on a class:
require 'runit/testcase'
module PVN
class TestCase < RUNIT::TestCase
include Loggable
WIQUERY_DIRNAME = "/Programs/wiquery/trunk"
class << self
def setup
@@orig_location = Pathname.pwd
end
def teardown
Dir.chdir @@orig_location
end
def suite
@@cls = self
ste = super
def ste.run(*args)
@@cls.setup
super
@@cls.teardown
end
ste
end
end