views:

51

answers:

1

So I copied the sample code from the Moq home page pretty much verbatim, and am getting a castle proxy exception.

Here's my code (as a console app for an easier sample)

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

Everything compiles nicely, but when it calls mock.Object The following exception is thrown.

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: 

So it appears to be a Castle Proxy component that's missing, but I'm referencing the binary from the NET40-NoCastle directory.

Latest version of Moq (Moq.4.0.10827)

And I'm new to Moq, so I may be doing something extremely dense.

A: 

It turns out the problem was that I was using the NET40-NoCastle binaries, which apparently means you are using Castle Windsor and already have the Castle Windsor binaries in your project. I had the misassumption this directory was for projects that don't use Castle Windsor.

Anyway, bottom line, if you're have this same issue, use the binaries from the NET40 directories instead.

Thanks Ben Alabaster for the answer via Twitter.

John MacIntyre