I did some work this week on a command line installer for RBS. I needed to make some modifications to the install process. I wanted to-do this the TDD way. I did not want to refactor the entire project just to make it testable, I thought I would try to come up with a nice way to test my console application. I needed to capture the output of the console application to check that my new features were working correctly.
RBS is remote blob storage, see the RBS blog http://blogs.msdn.com/sqlrbs/
Firstly I tried to launch the exe and capture the output, this worked well but I could not debug my new code. I know true TTDers don't use debuggers, but I needed to :)
I managed to get this working by referencing my Console Project from my test project (yes you can reference an EXE). I could then add code like :
InstallProviderSetup.Main(new string[] { "-CLIENTCONFIG" });
As you can see, you can just call the static Main method from code. To see if my test worked I need to check the output of the console application. I did this with the following code :
var stdout = GetStdOut();
Assert.AreEqual(true, stdout.Contains("The required switch CONFIGURATIONFILE"),"The required switch CONFIGURATIONFILE not in console out");
Assert.AreEqual(true, stdout.Contains("The required switch NAME"),"The required switch NAME not in console out");
The rest of the code is :
MemoryStream memoryStreamConsole;
StreamWriter streamWriterConsole;
[TestInitialize()]
public void TestInitialize()
{
memoryStreamConsole = new MemoryStream();
streamWriterConsole = new StreamWriter(memoryStreamConsole);
Console.SetOut(streamWriterConsole);
}
protected string GetStdOut()
{
streamWriterConsole.Flush();
var rval = Encoding.Default.GetString(memoryStreamConsole.ToArray());
System.Diagnostics.Trace.WriteLine(rval);
return rval;
}
Feel free to view the entire project at codeplex
You can find out more about Diagonal and Wisdom by visting the wisdom website
good article.
ReplyDelete