We are using Moles currently to test some code that interacts with a 3rd party library. The library was not setup for testing very well (hence the need for moles) and the issue that I am running into is that they only publicly expose a single abstract class. The concrete implementations are internal to the 3rd party library.
The issue I am facing is that when trying to create an instance of the public type it is requesting a concrete type from moles, but moles isn't generating moles objects for those types because they are internal.
Under the moles documentation the way to expose the internals is to add the InternalsVisibleTo attribute in the AssemblyInfo.cs file. However this is to expose my assembly internals for moles to use, since these are 3rd party libraries with already created assemblies I don't know how to go about making those internals visible so that moles can use them.
Anyways, any help on this would be great. I will settle for an integration test is that is the only solution, but hope to not have to go to that point.
An approach I've used very successfully is to roll my own proxy classes for unmockable third party types. E.g. I want to take a dependency on a type
ThirdParty.Foo
which is sealed/static/has no interface/etc. Instead, I create a library calledThirdParty.Proxies
and add a concrete typeFoo
and an interfaceIFoo
to this new library. The interfaceIFoo
exposes members equivalent to all those which I require from the underlyingThirdParty.Foo
type and the concrete typeThirdParty.Proxies.Foo
implements those members by doing nothing other than forwarding method calls to the underlying third party library.ThirdParty.Proxies
is excluded from unit testing and code coverage. In my consuming assembly, I take a dependeny only onThirdParty.Proxies
and, specifically, I only take a dependency onIFoo
. This way I can mock this dependency easily and attain 100% code coverage for my consuming assembly.This is a little more work, and it's similar to what Moles does for you dynamically, but once done it can be re-used everywhere and your unit tests will be faster by not incurring the overhead of Moles.