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

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

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

Re[3]: nunitでテストメソッド内のクラス生成


(過去ログ 63 を表示中)

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

■36400 / inTopicNo.1)  nunitでテストメソッド内のクラス生成
  
□投稿者/ XX (1回)-(2009/05/28(Thu) 14:20:29)

分類:[C#] 

ProjectA
  テストされる側のプロジェクトです。
  AppConfigクラスがあります。

public class AppConfig
{
    private string field1;
public AppConfig()
{
this.readConfig();
//フィールドに読込んだ値をチェックしています。
this.validate();
}
private void readConfig()
{
try
{
field1 = ConfigurationManager.AppSettings.Get("XXX");
}
catch (Exception e)
{
throw new ConfigurationErrorsException("ApplicationConfigファイルの解析に失敗しました。" + e.Message);
}

}

}


ProjectB
  nunitを使用しAppConfigTestクラスから、ProjectAのAppConfigクラスをテストします。


[TestFixture]
public class AppConfigTest
{
private AppConfig appConfig = null;
[SetUp]
public void setUp()
{
AppConfig appConfig = new AppConfig();
    }
    ・
    ・
    ・
}

上記のテストをDebugger実行すると、new AppConfig();の所で、イミディエイトに下記のようなエラーが出力され、AppConfigクラスをnew出来ません。
'System.NullReferenceException' の初回例外が CreateEntryForm.exe で発生しました。
ステップ イン: 非ユーザー コード 'NUnit.Core.Reflect.InvokeMethod' をステップ オーバーしています
ステップ イン: 非ユーザー コード 'NUnit.Core.TestMethod.doRun' をステップ オーバーしています
ステップ イン: 非ユーザー コード 'NUnit.Core.TestMethod.Run' をステップ オーバーしています
ステップ イン: 非ユーザー コード 'NUnit.Core.NUnitTestMethod.Run' をステップ オーバーしています
ステップ イン: 非ユーザー コード 'NUnit.Core.TestMethod.Run' をステップ オーバーしています
ステップ イン: 非ユーザー コード 'NUnit.Core.TestSuite.RunAllTests' をステップ オーバーしています

どのような原因があるのでしょうか?

nunitのバージョン 2.5.0.9122
.netframeworkバージョン 2.0
visual studio2008
引用返信 編集キー/
■36403 / inTopicNo.2)  Re[1]: nunitでテストメソッド内のクラス生成
□投稿者/ XX (2回)-(2009/05/28(Thu) 15:24:17)
すみません。多分自己解決しました。

app.configは、スタートアップのものしか読込まれない?
なので、Aにあるapp.configをBにコピーし、実行すればいけました。

nunitは別プロジェクトをデバッガで呼び出したとき、ステップイン?されないみたいですね
validateメソッドで、nullに対してチェックを行っていたので、起きたエラーだと思います。

お騒がせしました。
引用返信 編集キー/
■36404 / inTopicNo.3)  Re[2]: nunitでテストメソッド内のクラス生成
□投稿者/ XX (4回)-(2009/05/28(Thu) 15:33:23)
とじます
解決済み
引用返信 編集キー/
■36407 / inTopicNo.4)  Re[1]: nunitでテストメソッド内のクラス生成
□投稿者/ biac (107回)-(2009/05/28(Thu) 16:07:05)
biac さんの Web サイト
> 上記のテストをDebugger実行すると、new AppConfig();の所で、イミディエイトに下記のようなエラーが出力され、AppConfigクラスをnew出来ません。

Debugger でステップ実行したとき?
NUnit ランナーからテストを実行したときは、 問題無いのですか?


> public AppConfig()
> {
> this.readConfig();
> //フィールドに読込んだ値をチェックしています。
> this.validate();
> }

コンストラクタ内でファイル I/O やったりゴチャゴチャやるのは、 好みじゃないんだけど、 まぁそれは置いといて f(^^;
# 個人的には、 クラス名から察するに、 シングルトンにして public static AppConfig GetConfig() てな感じのインスタンス取得メソッドを用意するところ。

必ずファイル I/O の部分は独立させて、 先にテストしましょう。

メソッド readConfig() が提示されたもの ( field1 にしか書き込まない ) ならば、
public AppConfig()
{
 this. field1 = AppConfig.ReadConfig();
 …

public static string ReadConfig()
{
 …
※ InternalVisibleTo 属性を使えば、 public じゃなくて internal でいいけど。

…みたいな感じで。


validate() メソッドも、 先にテストしておきたいところです。

public AppConfig()
{
 this. field1 = AppConfig.ReadConfig();
 AppConfig.Validate(this);
 …

public static void Validate(AppConfig cfg)
{
 string f1= cfg.field1;
 if(f1 == null)
  throw new … 
 …


それと。 AppConfig クラスをテストするコードを作っているんですよね?

> private AppConfig appConfig = null;
> [SetUp]
> public void setUp()
> {
> AppConfig appConfig = new AppConfig(); //←ココ、書き間違い? メンバ変数への代入だと解釈します。

テストメソッドに
 AppConfig appConfig = new AppConfig();
の 1行を毎回書くのがそんなにイヤですか?

SetUp / Teardown などには、 未テストのコードを入れないようにしましょう。
そして、 ちゃんとコンストラクタのテストメソッドを別に書きましょう。
[Test()]
public void ConstructTest()
{
 AppConfig appConfig = new AppConfig();
 Assert.IsNotNull(appConfig);
 Assert.AreEqual("foo", appConfig.Bar); //コンストラクト時に確定するプロパティのテスト
 …



# エスパー回答的には、 field1 が null のまま、 validate() の中で使ってる気が f(^^;

…あw
書いてる間に、 自己解決なされたようで。

> Aにあるapp.configをBにコピーし、実行すればいけました。

あぁ、 やっぱり。 で、 validate() 中で null 参照していた、 と。
まぁ、 でも投稿しておこう。 f(^^;
引用返信 編集キー/
■36408 / inTopicNo.5)  Re[3]: nunitでテストメソッド内のクラス生成
□投稿者/ biac (108回)-(2009/05/28(Thu) 16:08:46)
biac さんの Web サイト
あ、 ごめんなさい。 閉じ忘れ m(_`_)m
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -