问题
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.
回答1:
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 called ThirdParty.Proxies
and add a concrete type Foo
and an interface IFoo
to this new library. The interface IFoo
exposes members equivalent to all those which I require from the underlying ThirdParty.Foo
type and the concrete type ThirdParty.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 on ThirdParty.Proxies
and, specifically, I only take a dependency on IFoo
. 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.
来源:https://stackoverflow.com/questions/8100813/moles-and-internal-classes