Unit Testing a Private Method

So on a lark, I threw my hat into the ring for Portland Code Camp 2.0, I didn’t expect to get accepted, there were already a few sessions on unit testing and nunit but I figured, what the heck, let’s gear it for beginners, and do it in VB.Net.  Now I’m in the process of getting ready and I figured I should blog about things and or techniques as they came up.

For my first trick, testing a private method.

First rule of thumb: Don’t do this.

No really, Don’t.

You are locking the internals of your code down with your unit test, if you are having to test a private method, then chances are that method should be public on a different class.

However, if you are sitting in a situation where that kind of refactoring is just not going to be allowed and you still really-really-need-to-get-this-under-test, then this simple process can help.

Given

Private Function Add2Integers(byval x as integer, byval y as integer) as integer

    return x + y

End Function

You want to get this under test, but you want this to be a refactor (which is NOT another word for maintenance, it’s a word for code clean up, not feature changing) which means no changes as far as the users are concerned.

Try this, wrap the code in a compiler conditional, and then just call the function, and then pass the value back out.

Now your unit tests can access the private method.

#If DEBUG Then

Public Function public_Add2Integers(byval x as integer, byval y as integer) as integer

return Add2Integers( x, y) as integer

End Function

One more time, really, don’t do this, if you are not REALLY careful, this will come back and bite you hard.