Jonathan ‘Peli’ de Halleux wrote an article ‘Pex It: Testing Internal classes‘. I just want to let the world know that you also can test non-public classes with MbUnit. You need version 2.4.1.220 or higher to use this feature.
In example bellow we test IsWhite(Char) method of System.Number class inside mscorlib assembly. Using Reflector you can see that Number is an internal class and IsWhite is a private method of this class. We can test this method event if we don’t have the source code.
private static readonly string MSCorLibAssembly =
Environment.GetEnvironmentVariable("SystemRoot")
+ @"\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll";
[Test]
public void InternalClassTest()
{
string className = "System.Number";
object obj =
Reflector.CreateInstance(MSCorLibAssembly, className);
Assert.IsNotNull(obj);
Assert.AreEqual(true,
Reflector.InvokeMethod(
AccessModifier.Default, obj, "IsWhite", ' '));
Assert.AreEqual(false,
Reflector.InvokeMethod(
AccessModifier.Default, obj, "IsWhite", 'V'));
}
The Number class has only default constructor. It means we don’t need to send parameters when creating an instance.
Let’s look at another example. This time we’re going to write test for the Key and Value properties of System.Collections.KeyValuePairs class. This class is also internal. If you don’t believe me, use Reflector. KeyValuePairs class has only one constructor that takes two Object parameters.
[Test]
public void InternalClassNonDefaultConstructor()
{
string className = "System.Collections.KeyValuePairs";
object obj =
Reflector.CreateInstance(MSCorLibAssembly, className, 1, 'A');
Assert.IsNotNull(obj);
Assert.AreEqual(1, Reflector.GetProperty(obj, "Key"));
Assert.AreEqual('A', Reflector.GetProperty(obj, "Value"));
}
Happy Testing :)


