Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使代码内部化,但可用于其他项目的单元测试_C#_Unit Testing_Scope - Fatal编程技术网

C# 使代码内部化,但可用于其他项目的单元测试

C# 使代码内部化,但可用于其他项目的单元测试,c#,unit-testing,scope,C#,Unit Testing,Scope,我们将所有的单元测试放在他们自己的项目中。我们发现,我们必须公开某些类,而不仅仅是为了单元测试而进行内部测试。无论如何都有办法避免这样做。将类公开而不是密封的内存意味着什么?类可以是公开的,也可以是密封的 但是,不要那样做 您可以创建一个工具来反射内部类,并发出一个通过反射访问所有内容的新类。MSTest就是这样做的 编辑:我的意思是,如果你不想在你的原始程序集中包含任何测试内容;如果成员是私有的,也可以这样做。如果它是一个内部类,则不能单独使用它。因此,除了测试内部使用该对象的其他类之外,不应

我们将所有的单元测试放在他们自己的项目中。我们发现,我们必须公开某些类,而不仅仅是为了单元测试而进行内部测试。无论如何都有办法避免这样做。将类公开而不是密封的内存意味着什么?

类可以是公开的,也可以是密封的

但是,不要那样做

您可以创建一个工具来反射内部类,并发出一个通过反射访问所有内容的新类。MSTest就是这样做的


编辑:我的意思是,如果你不想在你的原始程序集中包含任何测试内容;如果成员是私有的,也可以这样做。

如果它是一个内部类,则不能单独使用它。因此,除了测试内部使用该对象的其他类之外,不应该真正测试它

正如您不应该测试类的私有成员一样,您也不应该测试DLL的内部类。这些类是一些公共可访问类的实现细节,因此应该通过其他单元测试来很好地执行

其思想是,您只想测试类的行为,因为如果您测试内部实现细节,那么您的测试将是脆弱的。您应该能够在不破坏所有测试的情况下更改任何类的实现细节

如果您发现确实需要测试该类,那么您可能首先需要重新检查该类为何是内部类。

如果您使用的是.NET,则assembly属性允许您创建“朋友”程序集。这些是特定的强名称程序集,允许访问其他程序集的内部类和成员

注意,这应该谨慎使用,因为它紧密地连接所涉及的组件。InternalsVisibleTo通常用于单元测试项目。出于上述原因,它可能不是在实际应用程序程序集中使用的好选择

示例:

[assembly: InternalsVisibleTo("NameAssemblyYouWantToPermitAccess")]
namespace NameOfYourNameSpace
{

用于文件编制目的

或者,您可以使用
Type.GetType
方法实例化内部类

范例

//IServiceWrapper is public class which is 
//the same assembly with the internal class 
var asm = typeof(IServiceWrapper).Assembly;
//Namespace.ServiceWrapper is internal
var type = asm.GetType("Namespace.ServiceWrapper");
return (IServiceWrapper<T>)Activator
    .CreateInstance(type, new object[1] { /*constructor parameter*/ });
//IServiceWrapper是公共类,它是
//与内部类相同的程序集
var asm=类型化(IServiceWrapper).Assembly;
//Namespace.ServiceWrapper是内部的
var type=asm.GetType(“Namespace.ServiceWrapper”);
返回(IServiceWrapper)激活器
.CreateInstance(类型,新对象[1]{/*构造函数参数*/});
对于一般类型,有如下不同的过程:

var asm = typeof(IServiceWrapper).Assembly;
//note the name Namespace.ServiceWrapper`1
//this is for calling Namespace.ServiceWrapper<>
var type = asm.GetType("Namespace.ServiceWrapper`1");
var genType = type.MakeGenericType(new Type[1] { typeof(T) });
return (IServiceWrapper<T>)Activator
     .CreateInstance(genType, new object[1] { /*constructor parameter*/});
var asm=typeof(IServiceWrapper).Assembly;
//请注意名称空间。ServiceWrapper`1
//这用于调用Namespace.ServiceWrapper
var type=asm.GetType(“Namespace.ServiceWrapper`1”);
var genType=type.MakeGenericType(新类型[1]{typeof(T)});
返回(IServiceWrapper)激活器
.CreateInstance(genType,新对象[1]{/*构造函数参数*/});

以下是在.NET核心应用程序中使用的方法

  • 添加AssemblyInfo.cs文件并添加
    [汇编:InternalsVisibleTo(“AssemblytoVisible”)]
  • 将其添加到.csproj文件中(包含内部类的项目)
  • 
    

    实施细节应作为全面测试的一部分来执行。不要偷看私有变量。。。测试预期的行为。如果测试是正确的。。所有内部管道和接线应作为测试的一部分进行测试。投票通过。我不一定同意这一点,因为这些类对DLL中的其他类是“公共”的,并且类的功能应该进行独立测试。我也不同意。单元是单元,它们必须单独测试。很好的一般指导原则,但我们不要武断。测试有两个主要目的:1)回归-确保没有破坏某些东西,2)提高开发速度。如果每次我想写一行代码的时候,我都要支持一个庞大的服务,那么我将阻碍开发。如果我有一个复杂的内部部件,我希望能够单独开发和测试。相反,我不希望所有的测试都是孤立的(从而降低回归测试值,或者复制测试代码),但是有些代码证明了隔离的合理性。也许关键是使它成为一个单独的程序集。这里的OP是正确的。您正在将测试与内部实现耦合。因此,您的团队永远是修补测试和可怕的模拟代码的奴隶。仅测试公共API,可以是打包的lib API或网络公开的API。所有代码应可通过前门执行。测试实现是TDD基本消亡的原因,它只是一个巨大的PITA来测试整个应用程序的每一类,而不是专注于确保系统的行为。我认为几乎每个人,包括“权威”书籍,都有这个错误或不清楚的地方。我建议在属性周围放置一个#if DEBUG,然后在DEBUG中进行单元测试。这样,您就可以确保发布代码中没有设置属性。这只是一个想法,我不知道。。。。怎么样:#如果调试公共类IniReader#否则内部类IniReader#endif可能不推荐?为什么?那么,为什么要将测试限制在调试构建中呢?另外,这只是一个吹毛求疵的问题,没有必要对“朋友”程序集进行强烈命名(这可能是一个很好的做法,即使我个人的喜好不是这样说的,但不是强制性的)。不同意。如果我正在用非常薄的公共API构建一个复杂的组件,那么只通过公共API进行测试是不现实的。你会得到一个无法维护的泥球。相反,我会仔细定义内部单元并单独测试它们。正如杰里米·D·米勒(Jeremy D.Miller)经常说的:“先小测试,再大测试”。等待的可能重复,是什么?你是说不要做一个
    公共密封类
    ?你为什么会有这个宝石?@crush traumapony从20年前就没有登录过