我遇到了一个我正在尝试测试的课程的问题。我已经声明了一个私有枚举,我在代码中的通用字典中使用它。这个枚举在这个类之外没有任何意义,但它在私有方法中使用。当我生成代码时,访问器被写入通用字典类型,但在我尝试使用测试时抛出了无效的强制转换异常。
MyClass_Accessor target = new MyClass_Accessor();
Dictionary<MyClass_Accessor.MyEnum, long> dictionary = new Dictionary<MyClass_Accessor.MyEnum, long>();
dictionary.Add(MyClass_Accessor.Myenum.EnumValue, 1);
target.Method(dictionary); //Throws invalid cast exception here.
例外是accessor的通用字典=&gt;枚举,long无法转换为Myclass =&gt;恩,长。
除了改变我的工人阶级之外,有没有办法可以测试这个方法?
答案 0 :(得分:4)
您可以使用InternalsVisibleTo程序集属性,并将您的私有内容更改为内部。 (如果你不能将你的私人枚举改为内部枚举,那么这将不起作用,但通常是可以接受的权衡。)
假设您有一个名为AssemblyA的程序集,它正在由AssemblyATest进行单元测试,并且由AssemblyAIntegTest进行集成测试,您可以将以下内容粘贴到AssemblyInfo.cs文件中:
using System.Runtime.CompilerServices;
// ...
[assembly: InternalsVisibleTo("AssemblyATest")]
[assembly: InternalsVisibleTo("AssemblyAIntegTest")]
如果您对主要程序集进行签名,则还需要对测试程序集进行签名,并提供完全限定,具有文化和主键的程序集名称。
答案 1 :(得分:0)
我必须承认这个问题对我来说并不清楚。但看起来你需要通过公共调用者测试你的私有方法。
在大多数情况下,当您使用TDD时,您可以创建一个公共方法来满足您的测试,然后在需要时在私有测试中重构它。
答案 2 :(得分:0)
我承认我没有调用私有函数也有私有定义,但看看你的代码似乎没有从你的字典对象中选择一个有效值。
代码不应该是这样的吗?
target.Method(dictionary[0]);
好的,请在下面发表评论。
以下代码来自使用类的私有方法(PaDeviceManager)的测试,是否可以根据您的要求进行调整?
PaDeviceManager paDeviceManager = PaDeviceManager.Create;
PrivateObject param0 = new PrivateObject(paDeviceManager);
PaDeviceManager_Accessor target = new PaDeviceManager_Accessor(param0);
PaDeviceManager_Accessor();
答案 3 :(得分:0)
我很乐意承认,在您的情况下,这是您可能需要执行的测试,在这种情况下,jrista的答案是可以遵循的(InternalsVisibleTo)。
但是在进行单元测试时,我认为通常不应该测试类的非公共API。如果这个枚举对于类是私有的,因此只在内部用于类,那么它也不应该出现在任何单元测试中。
单元的目的是测试它以确定您的类的公共(包括虚拟/抽象保护)API按预期执行。通过包含依赖于实现细节(例如此私有枚举)的测试,您基本上无法在将来更改实现(例如,可能不需要枚举的实现)。