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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With