2010-10-28 24 views
17

Así que copié el sample code desde la página de inicio de Moq casi textualmente, y estoy obteniendo una excepción de proxy de castillo.¿Por qué la excepción de inicializador de tipo 'Moq.Proxy.CastleProxyFactory' cuando se utiliza NET40-NoCastle?

Aquí está mi código (como una aplicación de consola para una muestra más fácil)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Moq; 

namespace MoqTestConsole 
{ 
    public interface ILoveThisFramework 
    { 
     bool DownloadExists(string s); 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Mock<ILoveThisFramework> mock = new Mock<ILoveThisFramework>(); 

      // WOW! No record/replay weirdness?! :) 
      mock.Setup(framework => framework.DownloadExists("2.0.0.0")).Returns(true); 

      // Hand mock.Object as a collaborator and exercise it, 
      // like calling methods on it... 
      ILoveThisFramework lovable = mock.Object; 
      bool download = lovable.DownloadExists("2.0.0.0"); 

      // Verify that the given method was indeed called with the expected value 
      mock.Verify(framework => framework.DownloadExists("2.0.0.0")); 
     } 
    } 
} 

Todo compila bien, pero cuando se llama a mock.Object se lanza la siguiente excepción.

System.TypeInitializationException was unhandled 
    Message=The type initializer for 'Moq.Mock`1' threw an exception. 
    Source=Moq 
    TypeName=Moq.Mock`1 
    StackTrace: 
     at Moq.Mock`1.<InitializeInstance>b__0() in d:\Code\moq\src\Source\Mock.Generic.cs:line 138 
     at Moq.PexProtector.Invoke(Action action) in d:\Code\moq\src\Source\PexProtector.cs:line 56 
     at Moq.Mock`1.InitializeInstance() in d:\Code\moq\src\Source\Mock.Generic.cs:line 136 
     at Moq.Mock`1.OnGetObject() in d:\Code\moq\src\Source\Mock.Generic.cs:line 153 
     at Moq.Mock.GetObject() in d:\Code\moq\src\Source\Mock.cs:line 152 
     at Moq.Mock.get_Object() in d:\Code\moq\src\Source\Mock.cs:line 147 
     at Moq.Mock`1.get_Object() in d:\Code\moq\src\Source\Mock.Generic.cs:line 131 
     at MoqTestConsole.Program.Main(String[] args) in C:\Projects\Test\MoqTestConsole\MoqTestConsole\Program.cs:line 25 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: System.TypeInitializationException 
     Message=The type initializer for 'Moq.Proxy.CastleProxyFactory' threw an exception. 
     Source=Moq 
     TypeName=Moq.Proxy.CastleProxyFactory 
     StackTrace: 
      at Moq.Proxy.CastleProxyFactory..ctor() 
      at Moq.Mock`1..cctor() in d:\Code\moq\src\Source\Mock.Generic.cs:line 54 
     InnerException: System.IO.FileNotFoundException 
      Message=Could not load file or assembly 'Castle.Core, Version=2.5.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc' or one of its dependencies. The system cannot find the file specified. 
      Source=Moq 
      FileName=Castle.Core, Version=2.5.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc 
      FusionLog==== Pre-bind state information === 
LOG: User = jsi-dev-001\jmacintyre 
LOG: DisplayName = Castle.Core, Version=2.5.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc 
(Fully-specified) 
LOG: Appbase = file:///C:/Projects/Test/MoqTestConsole/MoqTestConsole/bin/Debug/ 
LOG: Initial PrivatePath = NULL 
Calling assembly : Moq, Version=4.0.10827.0, Culture=neutral, PublicKeyToken=69f491c39445e920. 
=== 
LOG: This bind starts in default load context. 
LOG: No application configuration file found. 
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config. 
LOG: Post-policy reference: Castle.Core, Version=2.5.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc 
LOG: Attempting download of new URL file:///C:/Projects/Test/MoqTestConsole/MoqTestConsole/bin/Debug/Castle.Core.DLL. 
LOG: Attempting download of new URL file:///C:/Projects/Test/MoqTestConsole/MoqTestConsole/bin/Debug/Castle.Core/Castle.Core.DLL. 
LOG: Attempting download of new URL file:///C:/Projects/Test/MoqTestConsole/MoqTestConsole/bin/Debug/Castle.Core.EXE. 
LOG: Attempting download of new URL file:///C:/Projects/Test/MoqTestConsole/MoqTestConsole/bin/Debug/Castle.Core/Castle.Core.EXE. 

      StackTrace: 
       at Moq.Proxy.CastleProxyFactory..cctor() 
      InnerException: 

por lo que parece ser un componente Castillo proxy que le falta, pero estoy haciendo referencia al binario del directorio NET40-NoCastle.

La última versión de Moq (Moq.4.0.10827)

Y yo soy nuevo en Moq, por lo que puede estar haciendo algo extremadamente denso.

Respuesta

19

Resultó que el problema era que estaba usando los binarios NET40-NoCastle, lo que aparentemente significa que estás usando Castle Windsor y ya tienes los binarios de Castle Windsor en tu proyecto. Tuve la suposición errónea de que este directorio era para proyectos que no uso Castle Windsor.

De todos modos, en resumen, si tiene este mismo problema, utilice los binarios de los directorios NET40 en su lugar.

Gracias Ben Alabaster por la respuesta a través de Twitter.

+2

Cometí el mismo error, no es el mejor nombre que he visto – Karsten

+3

Hice exactamente lo mismo. El nombre del directorio falla, me temo. –

+1

¡Lo que dijeron! :-) –

Cuestiones relacionadas