Alkampfer's Place

Il blog di Gian Maria Ricci
posts - 659, comments - 871, trackbacks - 80

My Links

News

Gian Maria Ricci Mvp Logo CCSVI in Multiple Sclerosis

English Blog

Tag Cloud

Article Categories

Archives

Post Categories

Image Galleries

I miei siti

Siti utili

Rhino mocks ed InternalsVisibleTo

Sto da poco iniziando ad utilizazre Rhino, che trovo molto ben fatta come libreria di mock. Il primo problema che ho affrontato è il seguente. Durante il test mi piace utilizzare l'attributo InternalsVisibleTo per garantire al mio progetto di unit test di poter utilizzare tranquillamente i metodi marcati come internal della mia libreria sotto test.

Il problema accade quando vado a generare mock con Rhino e voglio dei mock tipizzati su un tipo che è interno, infatti viene generata questa eccezione.

failed: System.TypeLoadException : Type 'ProxyInterfaceSystemSystemObject_UserListImporter_InterfacesIMyInternalInterface_Rhino_Mocks_InterfacesIMockedObject
_System_Runtime_SerializationISerializable' from assembly 'DynamicAssemblyProxyGen, Version=0.0.0.0, Culture=neutral, PublicKeyToken=f362209d9bee91d8' is attempting to implement an inaccessible interface.

Il significato è chiaro, ogni libreria mock utilizza generazione dinamica di codice e per questo debbo indicare con InternalVisibleTo anche l'assembly dinamico che genera la libreria, che per fortuna è strongly typed (al contrario di NMock). Il problema è che non conosciamo la PublicKey utilizzata da ayende ma solo il token che non è sufficiente. La soluzione è veramente banale, basta scrivere un test che fa uso di mock, fare un mock di un qualsiasi oggetto, chiamiamolo MyMock e poi con reflection prendere la publicKey dell'assembly

System.BitConverter.ToString(System.Reflection.Assembly.GetAssembly(MyMock.GetType()).GetName().GetPublicKey())

In questo modo abbiamo la chiave pubblica, il risultato è questo.

[assembly: InternalsVisibleTo("DynamicAssemblyProxyGen,
PublicKey=0024000004800000940000000602000000240000525341310004000001000100
FB4FF5A7C8BBA6FEB6A6B75B260CD57C1B8B85B63A45DEDCB7081331740C870852AF30
ABD2A74700CCE1D7A01AEED019339DB202E010AC808396B2922362877C6AFC89932810
92434A223B9920CAC8BA409D138A97B73CD1BAAD813AF450B886E3D7F5A09EE450D415
145EB0524778A6BD1AE733FD2B6CEEBFD151620534BCB7"
)]

Spero che sia utile a qualcuno :D

Alk.

[EDIT]. Avevo parlato di questo in una mail ad Ayende, che ha risposto in tipo nemmeno 1 ora. Effettivamente Ayende mi comunica che questa cosa era gia stata prevista e quindi basta inserire

[InternalsVisibleTo(RhinoMocks.StrongName)]

Sicuramente il codice è più chiaro e sicuramente funzionerà se in futuro Ayende deciderà di cambiare chiave :P

Print | posted on mercoledì 7 febbraio 2007 15:58 | Filed Under [ .NET ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET