Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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#_.net_Unit Testing_Architecture - Fatal编程技术网

C# 如何测试工厂隐藏的类?

C# 如何测试工厂隐藏的类?,c#,.net,unit-testing,architecture,C#,.net,Unit Testing,Architecture,上下文。我在车辆工厂中嵌套了接口I车辆、类车辆工厂和私有类车辆。因此,除了VehiclesFactoryKw之外的所有代码都不知道IVehicle的任何实现 问题。如何对车辆进行单元测试?我到底应该这么做吗 假设1。我可以将车辆公开。但是,这将允许所有代码编写我试图避免的new vehicles factory.Vehicle(…) 假设2。我可以在车辆工厂中创建一个新的公共方法,例如。g、 ,它只调用车辆构造函数并将其参数传递给该构造函数(允许单元测试提供必要的模拟)。然而,这将允许所有代码调

上下文。我在
车辆工厂
中嵌套了接口
I车辆
、类
车辆工厂
和私有类
车辆
。因此,除了
VehiclesFactory
Kw之外的所有代码都不知道
IVehicle
的任何实现

问题。如何对
车辆进行单元测试?我到底应该这么做吗

假设1。我可以将
车辆
公开。但是,这将允许所有代码编写我试图避免的
new vehicles factory.Vehicle(…)

假设2。我可以在
车辆工厂
中创建一个新的公共方法,例如。g、 ,它只调用
车辆
构造函数并将其参数传递给该构造函数(允许单元测试提供必要的模拟)。然而,这将允许所有代码调用这个奇怪的方法

假设3。工厂是一场瘟疫;在任何地方都使用
new
操作符。然而,这将更紧密地结合我的代码

我应该如何对车辆进行单元测试

您可以使用反射在测试项目中创建车辆类的实例,或者将车辆类设置为内部,并使用InternalsVisibleToAttribute属性使其对测试项目可见。虽然从private切换到internal将使您的类对同一项目中的所有代码都可见,所以我不确定您是否可以接受它

我到底应该这么做吗


由您决定,如果它包含应用程序关键逻辑,您可能应该测试它。

我的第一个问题是车辆工厂到底在做什么,以及如何使用它?如果
车辆
类别在
车辆工厂
中是私有的,您将无法返回
车辆
的新实例。单元测试应该测试你的系统的公共API,所以你应该测试工厂。@AaronRoberts问:车辆工厂到底在做什么?它是如何使用的?答:例如,VehicleFactory调用一些其他服务,组装一个VehicleFactory。VehicleFactory实例并对其进行一些调整。另一个代码与调用方法Drive的实例交互,该方法的行为取决于车辆部件。因此,我想测试驱动方法;我会提供不同的车辆部件和方法参数,并验证结果。我想我理解,但如果除了在工厂内,没有办法与车辆类交互,我不确定直接测试车辆类是否是一个好主意。如果drive方法执行其他依赖代码,则可以验证是否正确调用了依赖代码。如果没有一个代码示例,很难告诉您,您可以看到一个有趣的讨论+使用PrivateObjects的建议谢谢您的回答。我将尝试一下这种方法,以揭示它可能带来的其他问题。我将通过如下方式检索一个SUT实例:var vehicle=(IVehicle)Activator.createInstance(Type.GetType(“VehiclesFactory.vehicle”))。然后我将调用它的公共接口方法。目前我对使用Activator.CreateInstance方法的helper方法感到满意。助手方法可以访问至少一种包含目标类型的组件的可见类型(例如,VehiclesFactory.Vehicle)。此外,它还将解除TargetInvocationException(如果有)并重新显示“真实”异常。显然,这种方法破坏了被测试模块和测试之间的编译时连接。