![](/img/trans.png)
[英]Override EF Core DbContext in ASP.NET Core WebApplicationFactory
[英]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 个组件的场景: A
、 B
、 C
。
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
(连同IClassFixture
和UnitTest1
)或必须将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.