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(如果有)并重新显示“真实”异常。显然,这种方法破坏了被测试模块和测试之间的编译时连接。