4

这些天来,我遇到了团队系统单元测试的问题。我发现自动创建的访问器类忽略了通用约束——至少在以下情况下:

假设您有以下课程:

namespace MyLibrary
{
 public class MyClass
 {
  public Nullable<T> MyMethod<T>(string s) where T : struct
  {
   return (T)Enum.Parse(typeof(T), s, true);
  }
 }
}

如果要测试 MyMethod,可以使用以下测试方法创建测试项目:

public enum TestEnum { Item1, Item2, Item3 }

[TestMethod()]
public void MyMethodTest()
{
 MyClass c = new MyClass();
 PrivateObject po = new PrivateObject(c);
 MyClass_Accessor target = new MyClass_Accessor(po);

 // The following line produces the following error:
 // Unit Test Adapter threw exception: GenericArguments[0], 'T', on
 // 'System.Nullable`1[T]' violates the constraint of type parameter 'T'..
 TestEnum? e1 = target.MyMethod<TestEnum>("item2");

 // The following line works great but does not work for testing private methods.
 TestEnum? e2 = c.MyMethod<TestEnum>("item2");
}

运行测试将失败,并出现上面代码段注释中提到的错误。问题是 Visual Studio 创建的访问器类。如果你进入它,你会得到以下代码:

namespace MyLibrary
{
 [Shadowing("MyLibrary.MyClass")]
 public class MyClass_Accessor : BaseShadow
 {
  protected static PrivateType m_privateType;

  [Shadowing(".ctor@0")]
  public MyClass_Accessor();
  public MyClass_Accessor(PrivateObject __p1);
  public static PrivateType ShadowedType { get; }
  public static MyClass_Accessor AttachShadow(object __p1);

  [Shadowing("MyMethod@1")]
  public T? MyMethod(string s);
 }
}

如您所见,MyMethod 方法的泛型类型参数没有约束。

那是一个错误吗?这是设计使然吗?谁知道如何解决这个问题?

4

5 回答 5

3

我投票错误。我不明白这怎么可能是设计使然。

于 2008-09-15T17:23:16.403 回答
2

这是关于连接的类似问题以供参考。 https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=324473&wa=wsignin1.0

于 2009-07-28T19:29:47.727 回答
1

我没有验证所有内容,但它看起来像调用:

TestEnum? e1 = target.MyMethod("item2");

使用类型推断来确定泛型类型参数 T。如果可能,请尝试在测试中以不同方式调用该方法:

TestEnum? e1 = target.MyMethod<TestEnum>("item2");

这可能会产生不同的结果。

希望有帮助!

于 2008-10-03T19:18:46.663 回答
1

看起来像一个错误。解决方法是将方法更改为internal并添加[assembly: InternalsVisibleTo("MyLibrary.Test")]到包含被测类的程序集中。

这将是我测试非公共方法的首选方式,因为它会产生更清晰的单元测试。

于 2010-08-25T23:01:58.820 回答
0

在 msdn 上搜索带有泛型的单元测试。这是一个已知的限制。为 Microsoft Connect 上的解决方案投票,因为它肯定需要解决。

于 2008-10-20T07:16:41.903 回答