C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.57187 の関連記事表示

<< 0 >>
■57187  単体テスト時の例外発生について
□投稿者/ unagi -(2011/02/16(Wed) 18:02:17)

    分類:[C#] 

    はじめまして。
    現在私はMicrosoftVisualStudio2010(Premium)、使用言語C#にて、単体テストを行っているのですが
    以下のようなコードの場合、VS2010で自動生成されるコードだと例外が発生してしまいます。
    (以下のコードは状況が再現するようにシンプルにしたものです)

    class Class1
    {
    private List<Class2> NumberList;

    private bool test(ref List<Class2> numberList)
    {
    numberList = new List<Class2>();
    Class2 c1 = new Class2();
    Class2 c2 = new Class2();
    Class2 c3 = new Class2();
    Class2 c4 = new Class2();

    c1.a = 10;
    c2.a = 20;
    c3.a = 30;
    c4.a = 40;

    numberList.Add(c1);
    numberList.Add(c2);
    numberList.Add(c3);
    numberList.Add(c4);
    return true;
    }
    }

    class Class2
    {
    public int a;
    }

    以上のコードからClass1の単体テストを作成(VS2010が自動で作成します)をすると以下のようなコードとなります。

    [TestMethod()]
    [DeploymentItem( "お勉強.exe" )]
    public void testTest()
    {
    Class1_Accessor target = new Class1_Accessor(); // TODO: 適切な値に初期化してください
    List<Class2_Accessor> numberList = null; // TODO: 適切な値に初期化してください
    List<Class2_Accessor> numberListExpected = null; // TODO: 適切な値に初期化してください
    bool expected = false; // TODO: 適切な値に初期化してください
    bool actual;
    actual = target.test( ref numberList );
    Assert.AreEqual( numberListExpected, numberList );
    Assert.AreEqual( expected, actual );
    Assert.Inconclusive( "このテストメソッドの正確性を確認します。" );
    }

    これをTODO部を適宜設定し(インスタンスの取得とか)、実行するとtarget.testメソッドの実行時に以下のような例外が発生します。

    テスト メソッド TestProject1.Class1Test.testTest が例外をスローしました:
    System.InvalidProgramException: JIT コンパイラで内部的な制限が発生しました。

    この原因として考えられるのはどのようなものがあるのでしょうか?
    このようなケースは実際少なくないと思ましたが、ネットを探しても同じような事象を見かけないため質問させて頂きました。
親記事 /過去ログ96より / 関連記事表示
削除チェック/

■57194  Re[1]: 単体テスト時の例外発生について
□投稿者/ Azulean -(2011/02/16(Wed) 22:47:39)
    No57187 (unagi さん) に返信
    > この原因として考えられるのはどのようなものがあるのでしょうか?

    以下は推測に過ぎません。
    List<Class2_Accessor> から List<Class2> への変換、さらには ref キーワードがついていることからうまく動作しないのではないでしょうか。

    たとえば、以下の手を取るとこのような例外は発生しません。

    ・Class1.test の引数から ref を消す
     →例外は出ないけど、コードとしては意味がない。
    ・Class1, Class2, Class1.test を public にする
    ・単体テスト作成時の警告に従って InternalVisibleTo 属性を付与する

記事No.57187 のレス /過去ログ96より / 関連記事表示
削除チェック/

■57196  Re[1]: 単体テスト時の例外発生について
□投稿者/ よねKEN -(2011/02/17(Thu) 00:49:24)
    回避方法はAzuleanさんの指摘の通りだと私も思います。(refの使用か、private指定のどちらかをやめる)
    #InternalVisibleTo属性は付与しても無理じゃないでしょうか。

    No57187 (unagi さん) に返信
    > テスト メソッド TestProject1.Class1Test.testTest が例外をスローしました:
    > System.InvalidProgramException: JIT コンパイラで内部的な制限が発生しました。

    InvalidProgramExceptionはILコードで不正がある場合に発生する例外です。
    コンパイラなどのILコードを生成するプログラムが吐き出したものがバグっているということです。
    (具体的には、自動生成される プロジェクト名+"_Accessor.dll"のILコードが不正)

    テストしたいメソッドが

    private bool test(ref List<Class2> numberList)

    というように「List<Class2>の参照」を要求していますが、privateメンバーのテストをする際に用いられるのは、
    自動生成されたClass2_Accessorクラスであり型が違うために、testメソッドが呼び出せないからですね。

    現状のVisual Studioのテスト機能のprivateメンバーのテストに対するサポートの実現方法から考えると
    ご質問のようなパターンのテストは仕様的にたぶんできないと思います。
記事No.57187 のレス /過去ログ96より / 関連記事表示
削除チェック/

■57199  Re[2]: 単体テスト時の例外発生について
□投稿者/ Azulean -(2011/02/17(Thu) 07:42:59)
    No57196 (よねKEN さん) に返信
    > #InternalVisibleTo属性は付与しても無理じゃないでしょうか。

    そのようです。ご指摘ありがとうございます。
    # 手元でテストしていたコードが ref 戻し忘れていたようです。orz
記事No.57187 のレス /過去ログ96より / 関連記事表示
削除チェック/

■57227  Re[3]: 単体テスト時の例外発生について
□投稿者/ Azulean -(2011/02/17(Thu) 22:49:03)
記事No.57187 のレス /過去ログ96より / 関連記事表示
削除チェック/

■57234  Re[4]: 単体テスト時の例外発生について
□投稿者/ unagi -(2011/02/18(Fri) 08:49:37)
    お世話になります。
    お返事が遅れました事、申し訳ありません。

    Azulean様、よねKEN様、回答ありがとうございました。
    なるほど、確かにアクセサの実装を見るとListが呼び出せない事が納得できました。
    この生成されるコードはマイクロソフト的にバグと呼んでも差し支えないものと
    思いましたので(単体テストの機能的に実働しないコードが生成されるため)、Connectに投稿してみました。

    今回はお二人のご指摘を受け、Class2をpublicとして実装することにしました。
    LISTで使用するクラスがpublicであればこの現象は起こらないようです。

    丁寧な回答ありがとうございました。
    今後ともよろしくお願いします。
記事No.57187 のレス / END /過去ログ96より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -