繁体   English   中英

ASP.NET 使用 InternalsVisibleTo 的核心 WebApplicationFactory 在 xunit 中不起作用

[英]ASP.NET Core WebApplicationFactory using InternalsVisibleTo does not work in xunit

我最初在 asp.net 文档上发布了一个问题,并在此处引用

自从公共的 Startup.cs 被删除以来,从 NET5 -> NET6 开始使用 WebApplicationFactory 破坏了许多测试。 另一种方法是迁移到程序,该程序一直有效,直到新模板出现。 在新模板中没有公共 class 程序,因此我们需要添加公共部分 class 程序 {}

我正在查看文档,他们使用 InternalsVisibleTo 提供了一个新的解决方案,这是更好的恕我直言,因为它不会仅出于测试目的而更改代码。

然而,这将导致这样的代码

public class UnitTest1 : IClassFixture<WebApplicationFactory<Program>>
{
  public UnitTest1(WebApplicationFactory<Program> applicationFactory)
  {
    
  }
}

然而问题是程序是内部的,它会触发 CS0051:

UnitTest1.cs(8, 12):[CS0051] 可访问性不一致:参数类型“WebApplicationFactory”比方法“UnitTest1.UnitTest1(WebApplicationFactory)”更难访问)

问题在于 xunit 要求其 class / 构造函数是公开的。

那么有没有人设法在没有公众部分的情况下让它工作?

如果您只想访问测试项目中自动生成的internal Program class, [InternalsVisibleTo]可以工作。

<ItemGroup>
  <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
    <_Parameter1>TestProject1</_Parameter1>
  </AssemblyAttribute>
</ItemGroup>

但是,您正在尝试使用internal类型作为public类型的类型参数,并期望public<internal>类型可以public访问。

想象一个有 3 个组件的场景: ABC
A定义internal class InternalImpl并设置了[InternalsVisibleTo("B")]
B定义public类型如下:

public class Container
{
   public AnotherPublicType<InternalImpl> AnIllegalPublicProperty { get; }
   // ...
}

在上面的示例中, AnIllegalPublicProperty是非法的,因为尽管程序集B可以访问类型InternalImpl ,但该类型仍然是内部的,并且不会被程序集C (或任何其他程序集)访问。

Infact, though AnotherPublicType is a public class, C# would not allow AnotherPublicType AnotherPublicType<InternalImpl> to be more accessible than internal, because the highest-allowed accessibility is the lowest accessibility of the type ( AnotherPublicType ) and its type arguments ( InternalImpl ). 将该属性更改为以下内容将起作用:

public class Container
{
   internal AnotherPublicType<InternalImpl> AnIllegalPublicProperty { get; }
   // ...
}

有关更多信息, 请查看规范 §7.5.3 可访问域

构造类型 T<A1, ..., Ae> 的可访问域是未绑定泛型类型 T 的可访问域和 arguments A1, ..., Ae 类型的可访问域的交集。

要回答您的问题,必须将WebApplicationFactory设为internal (连同IClassFixtureUnitTest1 )或必须将Program设为public

我相信 xunit 要求测试是公开的。
因此,您唯一的选择是将以下内容添加到Program.cs文件的末尾:

#pragma warning disable CA1050 // Declare types in namespaces
public partial class Program { }
#pragma warning restore CA1050 // Declare types in namespaces

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM