Using ReSharper to Quickly Abstract Framework Components

I’m going to demonstrate today how to use ReSharper to quickly abstract even very large framework components. These might even be components that otherwise offer no abstract parent or interface with which to abstract their use as a dependency. This can be an important step to take when trying to properly unit test a given class or method.

We’ll begin by defining a wrapper class. Use the keyboard shortcut CTRL-ALT-INS to quickly and easily add a class.

01ReSharperAddFileFromTemplate

02ReSharperAddFileFromTemplateName

Once this class has been generated we then build the class’ constructor. ALT-INS brings up the code generation menu. Select “Constructor…” from the menu.

03ReSharperCodeGenerationConstructor

We then add the Wrapper’s dependency, which is the object we’re trying to abstract, as a parameter to the constructor. ALT-Enter to accept adding the using statement.

04ReSharperCodeGenerationConstructorParameterType

ALT-INS to bring up the code generation menu quickly.

05ReSharperCodeGenerationConstructorParameter

Then, using ReSharper, change this parameter to initialize a field which ReSharper will add. The keyboard shortcut here is ALT-Enter and then selecting the first option in the menu.

06ReSharperCodeGenerationConstructorField

07ReSharperCodeGenerationConstructorConstructed

Now that the private field has been added we need to generate the Delegating Members of the Wrapper. ALT-INS brings up the code generation menu. Select ”Delegating Members…” from the menu.

08ReSharperCodeGenerationDelegatingMembers

Be sure to select the entire list of members which will generate a complete Wrapper class implementation.

09ReSharperCodeGenerationSelectAllMembers

10ReSharperCodeGenerationSelectMembersGenerated

Now that there’s a complete Wrapper class we’ll use the Refactor method to extract an abstract parent class. The keyboard shortcut for this is CTRL-SHIFT-R. Select “Extract Superclass…” from the menu.

11ReSharperRefactorExtractSuper

Select all public methods on the class.

12ReSharperRefactorExtractSelectAllPublic

Then select all of the methods that were previously selected and make them abstract.

13ReSharperRefactorExtractMakeAllAbstract

Finally, unselect the constructor method and move forward.

14ReSharperRefactorExtractUnselectConstructor

This will generate the base class, which is now a successful abstraction from the framework component that the Wrapper wraps. And the Wrapper will inherit from this base class.

15ReSharperRefactorExtractInherits

16ReSharperRefactorExtracNewBase

Next we need a Factory to abstract the creation of this new Wrapper.

17ReSharperAddFileFromTemplate

18ReSharperAddFileFromTemplateName

Build the Factory to use the Wrapper and return it.

19ReSharperCreateFactoryUsingWrapper

Now give the Factory its own interface using the Refactor method. The keyboard shortcut for this is CTRL-SHIFT-R. Select “Extract Interface…” from the menu.

20ReSharperRefactorExtractInterface

Again select all public methods for the interface members.

21ReSharperRefactorExtractInterface

Generate the interface for the Factory for the final level of abstraction.

22ReSharperInterface

23ReSharperInterfaceDefined

And finally consume the framework component from the abstracted class which is returned by the new Factory. The new Factory can be injected by most mocking frameworks since it’s abstracted by an interface.

24ReSharperInterfaceUsed

By using this method, and relying on the Factory interfaces and abstract Wrapper base classes instead of the concrete objects, we better define our seams in our application and provide for true unit testing. And all while working around issues such as internal sealed classes and so forth that tend to be common enough in the framework so as to regularly cause a headache, especially with unit testing.

Advertisement

Published by

John Brunnings

Thinker. Problem Solver. Technologist. Entrepreneur.

Discuss Below

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s