tags:

views:

79

answers:

2

Hi,

I´m trying to do TDD with an object that has a dependency on a COM Interface. I though about mocking the COM interface, while doing development testing, and do it real on the integration tests.

However, I cannot mock the COM interface, I tried with Moq, and it throws an exception:

System.TypeLoadException was unhandled by user code Message=Could not load type 'Castle.Proxies.iTunesAppProxy' from assembly 'DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. The type is marked as eligible for type equivalence, but either it has generic parameters, or it is not a structure, COM imported interface, enumeration, or delegate

Is it possible with other frameworks? How do you do TDD with COM dependent objects?

Thanks in advance!or delegate

+1  A: 

OK, I thing there is no straightforward way of doing that, not sure that some of mocking frameworks could mock COM.

What I have in my mind..

You have some COM interface, ISomeThing and COM object implements this interface CoSomeThing, this some real implementation. You should implemenent yet another COM component, that would implement same interface, but actually just mocking it - CoSomeThingMock.

In your code you instantiate CoSomeThingMock, instead of CoSomeThing and use it.

var component = new CoSomeThingMock();
var testObject = new Tested(component);
alexanderb
So, if i understod well, you are suggesting me doing a "manual" mock. Maybe that should work, but is not optimal.
iCe
You undrestanding right.. manual mock, is only something I could imagine for this..
alexanderb
Anyone wants to share a more automatic alternative?Otherwise I´m going to accept alexanderb's answer, I tried yesterday and is fully working.
iCe
+1  A: 

I would suggest that you take ownership of the interface of the COM object, this is where Dependency Inversion Principle would come into play.

If you don't have access to the source, you will have to create your own abstraction that wraps the COM Object, otherwise you will have third-party calls throughout your code.

[EDIT]

Now the abstraction should be able to be mocked. The actual implementation of the wrapper will have the COM object as a HAS-A relationship.

You will then want to have an integration test for the implementation.

You need to treat the COM object itself as if it was something similar to a database or graphic rendering engine or a web service.

Gutzofter
However, to do testing using my wrapper object I still need to satisfy the dependency between the wrapper and the COM Interface, thus, I still need to mock it.
iCe
@iCe - Sorry if I wasn't clear. I thought that you already decided on mocking.
Gutzofter
Understood, should work. Also I think this is a more clean approach. Thanks
iCe