Moq.netcore failing for .Net Core RC2
Asked Answered
I

1

16

So I had a solution working on .Net RC1 with Moq, and I've upgraded to RC2 which I found that Moq.netcore was created to run on the new platform.

I added aspnet-contrib to my NuGet.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="contrib" value="https://www.myget.org/F/aspnet-contrib/api/v3/index.json" />
    <add key="NuGet" value="https://api.nuget.org/v3/index.json" />
  </packageSources>
</configuration>

I've added moq.netcore to my project.json file.

"dependencies": {
  "Microsoft.NETCore.App": {
    "version": "1.0.0-rc2-*",
    "type": "platform"
  },
  "dotnet-test-xunit": "1.0.0-rc2-173361-36",
  "moq.netcore": "4.4.0-beta8",
  "xunit": "2.1.0"
},

"testRunner": "xunit",

"frameworks": {
  "netcoreapp1.0": {
    "imports": [
      "dotnet5.6",
      "portable-net451+win8"
    ]
  }
}

Basically I followed Cli Testing Abstractions UnitTests and I get the following error when instantiatin a Mock object:

System.IO.FileNotFoundException : 
  Could not load file or assembly 'System.Diagnostics.TraceSource, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.

  Stack Trace:
       at Castle.DynamicProxy.Generators.MethodWithInvocationGenerator.BuildProxiedMethodBody(MethodEmitter emitter, ClassEmitter class, ProxyGenerationOptions options, INamingScope namingScope)
       at Castle.DynamicProxy.Generators.MethodGenerator.Generate(ClassEmitter class, ProxyGenerationOptions options, INamingScope namingScope)
       at Castle.DynamicProxy.Contributors.CompositeTypeContributor.ImplementMethod(MetaMethod method, ClassEmitter class, ProxyGenerationOptions options, OverrideMethodDelegate overrideMethod)
       at Castle.DynamicProxy.Contributors.CompositeTypeContributor.Generate(ClassEmitter class, ProxyGenerationOptions options)
       at Castle.DynamicProxy.Generators.ClassProxyGenerator.GenerateType(String name, Type[] interfaces, INamingScope namingScope)
       at Castle.DynamicProxy.Generators.BaseProxyGenerator.ObtainProxyType(CacheKey cacheKey, Func`3 factory)
       at Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Type classToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options, Object[] constructorArguments, IInterceptor[] interceptors)
       at Moq.Proxy.CastleProxyFactory.CreateProxy(Type mockType, ICallInterceptor interceptor, Type[] interfaces, Object[] arguments)
       at Moq.Mock`1.<InitializeInstance>b__19_0()
       at Moq.Mock`1.OnGetObject()
       at Moq.MockDefaultValueProvider.ProvideDefault(MethodInfo member)
       at Moq.QueryableMockExtensions.FluentMock[T,TResult](Mock`1 mock, Expression`1 setup)
       at lambda_method(Closure )
       at Moq.Mock.GetInterceptor(Expression fluentExpression, Mock mock)
       at Moq.Mock.<>c__DisplayClass57_0`2.<SetupGet>b__0()
Inform answered 18/5, 2016 at 0:39 Comment(1)
Add more components to project.json starting with "Microsoft.Extensions.Logging.TraceSource"?Dorie
I
30

Edit: this trick is no longer necessary with Moq > 4.6.38-alpha:

"dependencies" {
  "Moq": "4.6.38-alpha"
}

This bug is likely caused by the fact System.Diagnostics.TraceSource is not directly referenced by the moq package and thus is not imported transitively in your project. To work around this limitation, you can explicitly reference the System.Diagnostics.TraceSource package:

Here's how we use it in our OAuth2 validation middleware tests project, that runs on both .NET Desktop and .NET Core:

{
  "buildOptions": {
    "warningsAsErrors": true
  },

  "dependencies": {
    "AspNet.Security.OAuth.Validation": { "target": "project" },
    "dotnet-test-xunit": "1.0.0-rc2-build10015",
    "Microsoft.AspNetCore.TestHost": "1.0.0-rc2-final",
    "Microsoft.Extensions.Caching.Memory": "1.0.0-rc2-final",
    "Microsoft.Extensions.Logging.Debug": "1.0.0-rc2-final",
    "Newtonsoft.Json": "8.0.3",
    "xunit": "2.1.0"
  },

  "frameworks": {
    "netcoreapp1.0": {
      "dependencies": {
        "Microsoft.NETCore.App": { "type": "platform", "version": "1.0.0-rc2-3002702" },
        "moq.netcore": "4.4.0-beta8",
        "System.Diagnostics.TraceSource": "4.0.0-rc2-24027"
      },

      "imports": [
        "dnxcore50",
        "portable-net451+win8"
      ]
    },

    "net451": {
      "dependencies": {
        "Microsoft.NETCore.Platforms": "1.0.1-rc2-24027",
        "Moq": "4.2.1312.1622"
      }
    }
  },

  "testRunner": "xunit"
}

https://github.com/aspnet-contrib/AspNet.Security.OAuth.Extensions/blob/master/test/AspNet.Security.OAuth.Validation.Tests/project.json#L21

Iodous answered 18/5, 2016 at 4:30 Comment(3)
Hmm... I tried System.Diagnostics, but yeah this makes sense. Seems a little weird, but I'll chalk it up to Moq being in beta. Thanks for the help.Inform
System.Diagnostics.TraceSource can be found in the Nuget Package Manager is Include prerelease is checked.Pierpont
Edited to mention that this trick is no longer needed with Moq 4.6.38-alpha.Engrossing

© 2022 - 2024 — McMap. All rights reserved.