【问题标题】:A non-collectible assembly may not reference a collectible assembly不可收集的程序集可能不引用可收集的程序集
【发布时间】:2020-11-14 12:43:42
【问题描述】:

我试图将 .Net Core 控制台应用程序和测试从 2.1 迁移到 3.1,但在我的测试中遇到了问题。我正在使用Moq 库,它工作正常。迁移后,我在尝试访问任何模拟对象时开始收到A non-collectible assembly may not reference a collectible assembly。我在全新的项目中重现了相同的行为。我无法找到有关此主题的任何相关信息。我已经用MSTestXunit 对其进行了测试。这是Moq 库问题还是.Net Core 3.1 应该对这种情况使用不同的方法?

using Moq;
using Xunit;

namespace NetCore3.Tests
{
    public interface IMyInterface{ }
    
    public class UnitTest
    {
        [Fact]
        public void Test()
        {
            var mock = new Mock<IMyInterface>();
            var tmp = mock.Object; // this line throwing exception
        }
    }
}

例外:

NetCore3.Tests.UnitTest.Test

System.NotSupportedException: A non-collectible assembly may not reference a collectible assembly.

System.NotSupportedException
A non-collectible assembly may not reference a collectible assembly.
   at System.Reflection.Emit.ModuleBuilder.GetTypeRef(QCallModule module, String strFullName, QCallModule refedModule, String strRefedModuleFileName, Int32 tkResolution)
   at System.Reflection.Emit.ModuleBuilder.GetTypeRefNested(Type type, Module refedModule, String strRefedModuleFileName)
   at System.Reflection.Emit.ModuleBuilder.GetTypeTokenWorkerNoLock(Type type, Boolean getGenericDefinition)
   at System.Reflection.Emit.ModuleBuilder.GetTypeTokenInternal(Type type, Boolean getGenericDefinition)
   at System.Reflection.Emit.TypeBuilder.AddInterfaceImplementation(Type interfaceType)
   at Castle.DynamicProxy.Generators.Emitters.ClassEmitter..ctor(ModuleScope modulescope, String name, Type baseType, IEnumerable`1 interfaces, TypeAttributes flags, Boolean forceUnsigned)
   at Castle.DynamicProxy.Generators.BaseProxyGenerator.BuildClassEmitter(String typeName, Type parentType, IEnumerable`1 interfaces)
   at Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator.Init(String typeName, ClassEmitter& emitter, Type proxyTargetType, FieldReference& interceptorsField, IEnumerable`1 interfaces)
   at Castle.DynamicProxy.Generators.InterfaceProxyWithoutTargetGenerator.GenerateType(String typeName, Type proxyTargetType, Type[] interfaces, INamingScope namingScope)
   at Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator.<>c__DisplayClass6_0.<GenerateCode>b__0(String n, INamingScope s)
   at Castle.Core.Internal.SynchronizedDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at Castle.DynamicProxy.Generators.BaseProxyGenerator.ObtainProxyType(CacheKey cacheKey, Func`3 factory)
   at Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(Type interfaceToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options, IInterceptor[] interceptors)
   at Moq.Mock`1.InitializeInstance()
   at Moq.Mock`1.OnGetObject()
   at Moq.Mock`1.get_Object()
   at NetCore3.Tests.UnitTest.Test() in C:\Work\NetCore3\NetCore3.Tests\UnitTest1.cs:line 14

项目文件:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>netcoreapp3.1</TargetFramework>
        <IsPackable>false</IsPackable>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.1" />
        <PackageReference Include="Moq" Version="4.14.5" />
        <PackageReference Include="xunit" Version="2.4.1" />
        <PackageReference Include="xunit.runner.visualstudio" Version="2.4.2"/>
        <PackageReference Include="coverlet.collector" Version="1.3.0"/>
    </ItemGroup>
</Project>

【问题讨论】:

  • 这可能会有所帮助:docs.microsoft.com/en-us/dotnet/framework/…。如果您搜索该错误消息,则 Castle 代理和可收集程序集存在问题。否则,我很想看看这个问题会发生什么
  • 长镜头,你用的是什么IDE?
  • JetBrains Rider 目前。
  • 它刚刚更新到最新的 EAP (2020.2 EAP 8),并以与我的完全相同的方式制动吗:)
  • 似乎他们已经有类似的错误报告:youtrack.jetbrains.com/issue/RIDER-48135

标签: c# .net-core moq


【解决方案1】:

为了其他人从谷歌登陆这个......

我们正在使用最新的 Rider/ReSharper EAP (2020.2 EAP 8),它在以下情况下引入了此错误:

  • 通过 Rider/ReSharper 测试运行程序运行测试
  • 测试项目引用并使用了一个模拟库,该库尝试生成动态代理(Moq、NSubstitute 等...)

JetBrains 在其开发分支中已修复此问题,并将在下一个 EAP 中修复。你可以在这里追踪:https://youtrack.jetbrains.com/issue/RIDER-48134

更新:EAP 9 已发布,可修复此问题? 您可以使用 JetBrains Toolbox 进行更新。

【讨论】:

  • 谢谢!遇到完全相同的问题!
  • 我在使用 Visual Studio 2019 和 MSTest 以及 NSubstitute 和 ReSharper EAP 8 时看到了同样的行为。这不仅仅是 Rider?
  • @SkipSaillors 如果您使用的是 Resharper 测试运行器,那与 Rider 的代码基本相同,因此请尝试使用 Visual Studio 测试运行器,它应该没有问题。
  • 2020.2 EAP 9 今日发布
  • EAP 9 修复了我的 R# 测试运行程序问题
猜你喜欢
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多