• ベストアンサー

App_Code配下のクラスをNUnitでテストする方法

App_Code配下のクラスをNUnitでテストする方法はないのでしょうか? ■環境:  ASP.NET 2.0  VB.NET(.NET Framework 2.0)  NUnit2.4.8 ■フォルダ構成(※抜粋):  (ルート)    App_Code      Dao      Service      Util      (省略)    WebForm      (aspxファイル郡) 通常App_Code配下にクラスはおかず、 別プロジェクトに切り出すものなのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
noname#158371
noname#158371
回答No.1

NUnitは私自身使わないので(.NET標準で搭載されている単体テスト機能を使っちゃうので)、的をはずしているかもしれませんが、 もし、App_Code配下のコードをテストしたい場合は、 恐らくASP.NETアプリケーションをプリコンパイルしないと NUnitでテストできないのではないかと思います。 参考サイト(英語) http://bytes.com/forum/thread454522.html aspnet_compiler.exe を使って、対象のWebプロジェクトをプリコンパイルし、その後、App_Code用に出来たプリコンパイル用DLLを Webプロジェクトに参照設定します。 後はWeb Project内でテスト用のコード(ドライバコード)を 書いて参照設定したApp_Codeのメソッドを呼び出してあげるしか 方法がないように思います。 プリコンパイル方法&MSBuildについては http://msdn.microsoft.com/ja-jp/library/cc671425.aspx を参照してください。 他に良い方法があればいいのですが、私が思いつくのはそれぐらいです。 ちなみに使っているVisual Studio のバージョンとエディションは 何でしょうか?差し支えなかったら、今後の情報共有のためにも ご教授下さい。宜しくお願いします。

参考URL:
http://bytes.com/forum/thread454522.html
numberboys
質問者

お礼

早速このような細かいご回答をくださり大変ありがとうございます。 VSのバージョンは次のとおりです。 Visual Studio 2005 Professional Edition ※よって、VSTSは使用したことがありません>_< aspnet_compiler.exeは私も本番環境へのデプロイに使用しています。 aspnet_compilerはプリコンパイルするのに現在1分強を要します。 一方、App_Code配下を別プロジェクトとした場合 そのプロジェクトをビルドするのは5秒ほどで終わります。(現在のクラス数:654) したがって、開発速度を保つためには 別プロジェクトにした方がよさそうに思いました。 しかし、そのためにはリソースファイルの共有という課題があります。   (現状) App_Code Exception XxxxException.vb ---> App_GlobalResourcesの.resxファイルを参照 WebForm .aspx.vb ---> 同じくApp_GlobalResourcesの.resxファイルを参照   App_Code配下には独自Exceptionクラスがあり、   これらのエラーメッセージはApp_GlobalResources配下の   .resxファイルを参照して取得していました。     一方WebFormでも検証コントロールのエラーメッセージのために   同じ.resxファイルを参照しています。   App_Code配下を別プロジェクトにすることで、   WebFormからもその新プロジェクトのリソースファイルを   参照したいと思うのですが、そのようなことは可能なのでしょうか。   それともリソースファイルを別々にもち、   Exceptionクラスが使用するメッセージを   新プロジェクトのリソースファイルの方に移すしかないでしょうか。 まだ調べてないですが、どちらからも(=ExceptionからもWebFormからも)   参照されているメッセージについては重複を黙認するしかないでしょうか。   (=App_GlobalResourcesの.resxファイルと   新プロジェクトのリソースファイルに同じメッセージをもつ) 話がそれてしまいますが、いま一度回答頂けますと幸いです。

すると、全ての回答が全文表示されます。

その他の回答 (2)

noname#158371
noname#158371
回答No.3

>ビルドが完成するまで3分15秒ほどかかります 確かに重いですね。 ちなみに、Visual Studio 2005にSP1はインストールされていますか? SP1を入れてだいぶスピードがマシになったことがあるので、 できればSP1をインストールして、IDE環境をスピードアップさせたいですね。 後、ビルドスピードに関しては、 Project構成によっても異なってくるので何ともいえないところでは ありますが、毎回ソリューションのビルドだと重くてつらいと思うので ある程度、ビルドオプション(ビルドモード)を 何種類か用意することで少しは短縮できると思います。 恐らく、デフォルトでは、DebugモードかReleaseモードの 2種類しかないと思うので、例えば、下記のようなモードの ビルドオプションを用意しておくといいかもしれませんよ。 ・Web ProjectだけのDebugビルドモード ・Web ProjectだけのReleaseビルドモード ・Web Project + 関連のあるProjectだけのDebugビルドモード ・Web Project + 関連のあるProjectだけのReleaseビルドモード ・Web Projectと関連のないクラスライブラリProjectだけをビルドするビルドモード など・・・ VS.NET 2005 Professional版だと、 [ビルド]メニュー→[構成マネージャー]で いろんなパターンのビルドモードを作れますので、一度試してみてください。 しかし、ASP.NETやVS.NETで悩まれるところはやはり皆さん同じだなと 実感しました。どうかがんばって下さい。

numberboys
質問者

お礼

たびたび回答ありがとうございます。 SP1は先日そのような期待を胸に適用しました。 しかし、ビルドスピードは 体感レベルでは違いがわかりませんでした。 なので、スピードアップしたとの kero-mioさんのお話に驚かされました。 ビルドオプションについてはノータッチです。 いまいち理解していません。勉強してみます。 情報提供ありがとうございます。 ためしにWebだけDebugビルドするようにしてみましたが これでは効果がなかったようです。 >しかし、ASP.NETやVS.NETで悩まれるところはやはり皆さん同じだなと実感しました。 やはりそうなのですね。みなさん悩んでおられる。 Seasarのようにさくさく開発したいものです。 ありがとうございました。

すると、全ての回答が全文表示されます。
noname#158371
noname#158371
回答No.2

補足情報ありがとうございます。 >そのプロジェクトをビルドするのは5秒ほどで終わります。(現在のクラス数:654) >したがって、開発速度を保つためには >別プロジェクトにした方がよさそうに思いました。 そうですね。これは別プロジェクトにした方が正解だと私も思います。 クラスファイル数が増えるとVS.NET2005のIDEが重くて話にならないので できるだけ別Projectにした方がいいです。 ただし、あまりApp_Codeで定義していたクラスが多数あるからと いって、複数のProjectに分割しすぎないで下さい。 ソリューション内に多数のProjectファイルがあるとVS.NET2005の IDEが重くて話にならないです。そこだけ配慮して頂けたらと思います。 >(現状) >App_Code >Exception >XxxxException.vb ---> App_GlobalResourcesの.resxファイルを参照 >WebForm >.aspx.vb ---> 同じくApp_GlobalResourcesの.resxファイルを参照 まず、resxは、カスタムツール + 名前空間を使って、バッティング しないように配慮する必要がありますね。 また、resxを元にした、Resourcesファイルを作り、 作ったResoucesファイルを格納するプロジェクトを1つ用意します。 すると、App_CodeをProjectにしたクラスからも該当リソースに アクセスできますよ! 若干高度なやり方ですが、こんな感じです。 ・リソース定義は今までどおり、App_GlobalResourcesにある  resxで定義する ・Resourcesファイルを格納したプロジェクトファイルの  ビルドオプションで、App_GlobalResourcesにある  最新のresxファイルを取得。Resourcesファイルを作る  リソース ファイル ジェネレータ (Resgen.exe)コマンドを動かすよう、  「ビルド実行時」の設定オプションで設定しておきます。  (ビルド実行時の設定オプションは、プロジェクトファイルの  プロパティを見てもらえればどっかにあります。) こうすると、aspxは、App_GlobalResourcesにあるresxを参照し、 App_Codeをプロジェクト化したクラスは、Resourcesファイルが 格納されているProjectファイルを参照することでリソース値を 取得する構成をとることができます。 このリソース ファイル ジェネレータ (Resgen.exe)を ビルド時に実行する時のサンプルコマンドラインを作ったことが あるんですが、今手元にサンプルがないので、サンプルを提示 できなくてすいません。 ただ、リソース ファイル ジェネレータ (Resgen.exe)は、 http://msdn.microsoft.com/ja-jp/library/ccec7sz1(VS.80).aspx に細かい使い方掲載されていますので、宜しければ検討して 頂けると幸いです。宜しくお願いします。

参考URL:
http://msdn.microsoft.com/ja-jp/library/ccec7sz1(VS.80).aspx
numberboys
質問者

お礼

たびたび非常に丁寧なご説明ありがとうございます。 まだ試せていませんが、おっしゃってることは理解できました。 とても助かりました。ありがとうございました。 VSはすでに大変重い状況です。 現在App_Code配下のクラスを修正したら、 ビルドが完成するまで3分15秒ほどかかります。たまりません。 この問題も、構成の変更などで解決できるならやってみたいですね。 ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A