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