如何在Visual Studio单元测试中使用包含私有类型的泛型

时间:2009-05-19 01:37:30

标签: c# unit-testing generics

我遇到了一个我正在尝试测试的课程的问题。我已经声明了一个私有枚举,我在代码中的通用字典中使用它。这个枚举在这个类之外没有任何意义,但它在私有方法中使用。当我生成代码时,访问器被写入通用字典类型,但在我尝试使用测试时抛出了无效的强制转换异常。

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;恩,长。

除了改变我的工人阶级之外,有没有办法可以测试这个方法?

4 个答案:

答案 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按预期执行。通过包含依赖于实现细节(例如此私有枚举)的测试,您基本上无法在将来更改实现(例如,可能不需要枚举的实现)。