Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Moq.netcore failing for .Net Core RC2

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()
like image 929
Saqib Rokadia Avatar asked May 18 '16 00:05

Saqib Rokadia


People also ask

What is Moq unit test in NET Core?

Moq - Unit Test In .NET Core App Using Mock Object. The Unit test is a block of code that helps us in verifying the expected behavior of the other code in isolation; i.e., there is no dependency between the tests. This is good way to test the application code before it goes for quality assurance (QA).

Does the MoQ library also support NET Core?

This library also supports .NET Core. The Moq library can be added to test projects either by package manager or .NET CLI tool. In the following example, controller class required constructor dependency to create the instance.

What is the difference between Moq and mock version?

A mock version of something is an object that can act like the real thing but can be controlled in test code. Moq (pronounced “mok u” or “mock”) is a library available on NuGet that allows mock objects to be created in test code and it also supports .NET Core.

How to add Moq library to test projects?

The Moq library can be added to test projects either by package manager or .NET CLI tool. In the following example, controller class required constructor dependency to create the instance.


1 Answers

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

like image 89
Kévin Chalet Avatar answered Sep 21 '22 01:09

Kévin Chalet