4

最近、Team System Unit Testing で問題が発生しました。自動的に作成されたアクセサー クラスが一般的な制約を無視することがわかりました - 少なくとも次の場合:

次のクラスがあるとします。

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

バグのようです。回避策は、メソッドをに変更し、テスト対象のクラスを含むアセンブリinternalに追加することです。[assembly: InternalsVisibleTo("MyLibrary.Test")]

これは、非公開のメソッドをテストするための私の好ましい方法です。これは、見た目がはるかにクリーンな単体テストを生成するためです。

于 2010-08-25T23:01:58.820 に答える
1

すべてを確認したわけではありませんが、次の呼び出しのようです。

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

型推論を使用して、ジェネリック型パラメーター T を決定します。可能であれば、テストで別の方法でメソッドを呼び出してみてください。

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

それによって、異なる結果が生じる場合があります。

それが役立つことを願っています!

于 2008-10-03T19:18:46.663 に答える
0

msdn でジェネリックを使用した単体テストを検索します。これは既知の制限です。解決する必要があることは間違いないため、Microsoft Connect で解決策を投票してください。

于 2008-10-20T07:16:41.903 に答える