NJect works on top of TypeMock Isolator, so before you run the code, you have to enable it. See instructions on their site.
In order to use it, you should follow these steps:
- Create an instance of the NJect.NJector class. You should do it before the target object is created.
- Inject code into one or more methods. You can inject your code before, after, or instead of the target method.
- Call the code that invokes creation of the target instance (or create it yourself). If you want, say, the third instance created, you can use the SkipInstances method of the NJector class.
- Call the code that invokes the target method(s).
Here's a sample. Using Reflector, I discovered that the System.Windows.Forms.Form.GetAutoScaleSize method creates a new instance of System.Drawing.Graphics and calls its MeasureString method. What I want to know is which text is being measured, and the result of the measurement. Here's how I do it:
public void Sample() {
var inject = new NJect.NJector(typeof(System.Drawing.Graphics));
// In order to make this work, you have to add the following call (see the explanations below):
// inject.SkipInstances(2);
// After each MeasureString call, run the diagnostic code
inject.After(
"MeasureString", // method name
new Type[] { typeof(string), typeof(System.Drawing.Font) }, // types of parameters
delegate(object target,
System.Reflection.MethodBase method,
object[] parameters,
object returnValue) { //inject the code in curly brackets
string text = parameters[0] as string; //the first argument
System.Drawing.SizeF result = (System.Drawing.SizeF)returnValue; //the return value
Console.WriteLine("MeasureString is called for '{0}', the result is {1}", text, result);
});
//call the actual code
var x = System.Windows.Forms.Form.GetAutoScaleSize(System.Windows.Forms.Form.DefaultFont);
}
If we actually run this code, we don't get any console output. This mystery can be solved with the help of the TypeMock Tracer. Turns out that 3 instances of the Graphics class are created, and only the third one calls MeasureString. So, we add a call to SkipInstances() at the beginning to get straight to the third instance.