2010-10-28 14 views
17

Je copié le sample code de la page d'accueil Moq à peu près mot pour mot, et je reçois une exception proxy du château.Pourquoi l'exception d'initialisation de type 'Moq.Proxy.CastleProxyFactory' lors de l'utilisation de NET40-NoCastle?

Voici mon code (comme une application de la console pour un échantillon plus facile)

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")); 
     } 
    } 
} 

Tout compile bien, mais quand il appelle mock.Object L'exception suivante est levée.

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: 

Il semble être un composant Proxy Castle qui manque, mais je fais référence binaire à partir du répertoire NET40-NoCastle.

Dernière version de Moq (Moq.4.0.10827)

Je suis nouveau à Moq, afin que je puisse faire quelque chose de très dense.

Répondre

19

Il se trouve que le problème était que j'utilisais les binaires NET40-NoCastle, ce qui signifie apparemment que vous utilisez le château de Windsor et ont déjà les binaires du château de Windsor dans votre projet. Je l'avais misassumption cet annuaire a été pour projets que se font pas utiliser le château de Windsor.

Quoi qu'il en soit, la ligne du bas, si vous avez ce même problème, utiliser les binaires des répertoires NET40 à la place.

Merci Ben Alabaster la réponse via Twitter.

+2

J'ai fait la même erreur, ce n'est pas la meilleure appellation que j'ai vu – Karsten

+3

je viens de faire exactement la même chose aussi. Le nommage d'annuaire échoue j'ai peur. –

+1

Ce qu'ils ont dit! :-) –