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

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

C# と VB.NET の入門サイト

Re[4]: 単体テスト時の例外発生について


(過去ログ 96 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■57187 / inTopicNo.1)  単体テスト時の例外発生について
  
□投稿者/ unagi (1回)-(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 コンパイラで内部的な制限が発生しました。

この原因として考えられるのはどのようなものがあるのでしょうか?
このようなケースは実際少なくないと思ましたが、ネットを探しても同じような事象を見かけないため質問させて頂きました。

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

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

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

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


引用返信 編集キー/
■57196 / inTopicNo.3)  Re[1]: 単体テスト時の例外発生について
□投稿者/ よねKEN (678回)-(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メンバーのテストに対するサポートの実現方法から考えると
ご質問のようなパターンのテストは仕様的にたぶんできないと思います。
引用返信 編集キー/
■57199 / inTopicNo.4)  Re[2]: 単体テスト時の例外発生について
□投稿者/ Azulean (692回)-(2011/02/17(Thu) 07:42:59)
No57196 (よねKEN さん) に返信
> #InternalVisibleTo属性は付与しても無理じゃないでしょうか。

そのようです。ご指摘ありがとうございます。
# 手元でテストしていたコードが ref 戻し忘れていたようです。orz
引用返信 編集キー/
■57227 / inTopicNo.5)  Re[3]: 単体テスト時の例外発生について
□投稿者/ Azulean (693回)-(2011/02/17(Thu) 22:49:03)
Connect に投稿されておられるようなのでリンクしておきます。

https://connect.microsoft.com/VisualStudioJapan/feedback/details/644689/
引用返信 編集キー/
■57234 / inTopicNo.6)  Re[4]: 単体テスト時の例外発生について
□投稿者/ unagi (2回)-(2011/02/18(Fri) 08:49:37)
お世話になります。
お返事が遅れました事、申し訳ありません。

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

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

丁寧な回答ありがとうございました。
今後ともよろしくお願いします。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -