C# 如何使用InternalsVisibleTo而不创建循环引用
我对C# 如何使用InternalsVisibleTo而不创建循环引用,c#,.net,reflection,C#,.net,Reflection,我对InternalsVisibleTo的理解是,它主要用于单元测试。但是这意味着我的单元测试类,如果它在一个单独的项目中,需要一个对包含InternalsVisibleTo类的项目的引用,并且该类还需要一个对单元测试类的引用,以便将其程序集名称放入属性的参数中 如何解决这一难题?考虑以下项目结构 您有一个名为Company.Org.PersonManager的项目,正在构建一个名为 Company.Org.PersonManager.dll 它包含以下类声明 internal class P
InternalsVisibleTo
的理解是,它主要用于单元测试。但是这意味着我的单元测试类,如果它在一个单独的项目中,需要一个对包含InternalsVisibleTo
类的项目的引用,并且该类还需要一个对单元测试类的引用,以便将其程序集名称放入属性的参数中
如何解决这一难题?考虑以下项目结构 您有一个名为
Company.Org.PersonManager
的项目,正在构建一个名为
Company.Org.PersonManager.dll
它包含以下类声明
internal class Person
{
public string Foo();
}
如果要测试Foo方法,可以在名为Company.Org.PersonManager.test的项目中编写nunit测试
实现可能类似于:
[TestFixture]
public class TestPersonManager
{
[Test]
public void Test_Foo()
{
Person p = new Person();
Assert(p .... );
}
}
上面的代码不会编译,因为Person类仅在assemblyCompany.Org.PersonManager.dll中内部可见
如果您添加以下行,InternalsVisibleTo
就是在这里派上用场的
[assembly: InternalsVisibleTo("Company.Org.PersonManager.Test.dll")]
对于项目Company.Org.PersonManager
中的Properties/AssemblyInfo.cs
,您告诉编译器程序集
Company.Org.PersonManager.Test.dll
可以访问程序集中的内部类和方法Company.Org.PersonManager.dll
这不应导致循环引用,Company.Org.PersonManager.Test
应具有对Company.Org.PersonManager
的引用,但不需要其他引用。测试中的程序集(使用您正在测试的类)不需要对UT程序集的引用。它只需要在[InternalsVisibleTo]
中提到它的名字。什么是第22条军规?你试过了吗?您不需要仅仅为了获得单元测试程序集的名称而引用它。您知道程序集的名称…只需将其传递给属性。如果你上班有困难,那是因为你做错了,而不是因为有强制性的循环参考。如果你想不出答案,就发布一个新问题,其中包括一个可靠地再现问题的好问题,准确地解释你试图解决它的原因,以及给你带来麻烦的具体原因。