2009-07-29 10 views
43

私はASP.net Webサイトプロジェクト(.net 3.5)を持っています。現時点では、コードファイル以外のコードファイル(Linq2Sqlの内容、データコンテキスト、ビジネスロジック、拡張メソッドなど)はすべて、App_Codeフォルダにあります。ユニットテストASP.net WebサイトApp_Codeに格納されたプロジェクトコード

私は、プロジェクトの少なくとも一部のセクションでユニットテスト(nunitを使用)を導入することに興味があります。私がやっている単位テストは、現在App_Codeフォルダにあるすべてのコードに完全にアクセスする必要があります。私はこれまで、いくつかの初期の読み取りを行っている、とコンセンサスがあるように思わ:

  • これは
  • ユニットテストの私の現在の設定与えられたことはできませんが、コンパイルされたDLLの一部であるクラスを参照する必要があり、およびWeb定義によるサイトプロジェクトは、実行時にのみコンパイルされます。
  • 私はプロジェクト全体をWebアプリケーションに変換するか、テストしたいコードをすべて(つまり、App_Codeの内容全体を)クラスライブラリのプロジェクトと参照に移動する必要がありますWebサイトプロジェクトのクラスライブラリプロジェクト。いずれのクラスでも、コンパイルされたdll形式で必要なクラスへのアクセスが可能になり、ユニットテストが可能になります。

これは間違いありませんか?それとも、プロジェクト全体を再構築/リファクタリングせずに単体テストできるという別の方法がありますか?

答えて

19

あなたの結論は正しいようです。機能を1つまたは複数のクラスライブラリプロジェクトに移動することに投票します。これは、他のプロジェクトでも同じ機能を再利用するための扉を開く可能性があるためです。

1

OPが述べたように、Webアプリケーションプロジェクトに移行することも可能です.Webアプリケーションプロジェクトは、クリーナーでもあり、ページはwepアプリケーションプロジェクトに残ることができます.1つのDLL(テスト可能)にします。あなたのビジネスロジックなどはすべて、別のクラスライブラリ/ライブラリに入れられます。

+0

になります。また、私はこの質問が既にこれを知っている人を対象としていると感じています。 –

2

App_codeをまだ使用しているようですが、このロジックを独自のクラスライブラリプロジェクトに移動するか、プロジェクトタイプをWebアプリケーションに変更します(FredrikとColinの提案に従います)。

私はいつも自分のASP.NETプロジェクトをWebアプリケーションプロジェクトとしてWebサイトではなく作成します。

+0

リンクをありがとう。しかし、間違いなく醜い解決策のように見えます。 –

+0

はい、絶対的に - したがって、より正気なルートの1つを下る方が良いです。 – RichardOD

11

私たちは、私の会社では、この問題を持っている私たちは頻繁に使用することのラウンド2つの方法があり

(私の上司は、バージョン管理に関するいくつかのゴミ...をDLLを好きではありません):

1)取得単体テストを行うCIツール:私たちは非常にタイトなNUnit統合を持つTeamCityを使用しています。私たちのソリューションは、これが有効なオプションであるためには、十分迅速に構築されています(十分なテストはほとんどありません)。

2)結果のバイナリを手動でプリコンパイルしてユニットテストする:コマンドラインからASP.netコンパイラ/ MSBuildを実行することができます(パブリッシュビルドを行っているかのように) 。

しかし、コードをバイナリ(クラスライブラリ)に分離するか、単にWebアプリケーションを使用するという選択肢があれば、より良い選択肢として提案したいと思います。

+5

.Net以前のバージョンのdllは悪夢でした。私はこれが "dllの地獄"と愛称されたと信じています。 .Netを使用すると、これはもはや実際には問題ではありません。 – TheLukeMcCarthy

20

私のお店は、MVCプロジェクトのための答えを最終的に作成しました。 StackOverflowで多くの死者を追いかけてきたので、私はそれを共有したいと思っています。我々はこのようにそれを実行します。

  • オープンMVCフォルダ「をウェブサイトとして、ローカルのIISから」インテリセンスとデバッグが正常に動作し
  • は、私たちのソース制御ディレクトリ
  • に住んでいるユニットテストプロジェクトを追加取得します
  • Webサイトとして開いているプロジェクトにプロジェクトを追加できないため、ビルド前のステップをTESTプロジェクトに追加します。ウェブサイトが\ FooSiteで、 のテストプロジェクトが\ FooSite.Testsであるとします。コンパイルされたアプリケーションコードはFooSite.Tests \ FooSite_Precompiled \ binに になります。
  • *
<Target Name="BeforeBuild"> 
    <AspNetCompiler VirtualPath="FooSite" TargetPath="$(ProjectDir)\FooSite_Precompiled" Force="true" 
Debug="true" /> </Target> 
  • テストプロジェクトでFooSite_Precompiled/binに/ App_Code.dllへの参照を追加します。
  • ブームだよ。ケーキを食べて食べることもできます。あなたのソリューションでBuildをクリックするたびに、 MSBuildとは異なり、app_codeをコンパイルすることができるあなたのウェブサイトcsproj(まだ存在します)にaspnet_compiler.extツール を呼び出し、Debug = "true"を入力すると あなたの単体テストをデバッグするときのapp_code.dllコード。 は、更新された単体テストを実行しているときにのみビルドする必要があります。 あなたのページの変更の影響を見ているときは、 Webサーバーから呼び出されたときに、 のapp_codeフォルダが動的にコンパイルされてからコードを変更/ページを保存/リフレッシュするだけです。
+0

これは受け入れられる回答である必要があります。テストプロジェクトをビルドするときにAspNetCompilerを実行するのはかなり遅いので、Execタスクを使用してApp_Codeファイルだけのビルドを実行しています。 –

+0

どうやってそれを正確に設定しましたか?特定のmsbuildコマンドを呼び出すexecタスク?例を共有できますか? –

+0

私たちはExecタスクで呼び出される独自のツールを使用しますが、直接CSCを呼び出すか、App_Codeフォルダ内のすべてのソースファイルを含む別々のプロジェクトファイルを使用することで可能になります。面白いのは、私が最近Visual Studio 2012でこのシステムに問題が発生したときにこれを聞いてみるべきです。誰かが問題の解決に役立つかどうかを確認するための質問を投稿しました。 1つ私は使用しています:http://stackoverflow.com/questions/13138820/visual-studio-2012-msbuild-incremental-build-not-detecting-changes –

5

誰もが自分自身はブライアンのソリューションを実装見つける必要があり、ここでWebsite.targetsあなたはユニットテスト・ソリューションに含めることができるファイルです。 App_Codeが変更されたときにのみWebサイトをコンパイルします。ただ、WebsiteNameWebsitePathをカスタマイズし、あなたの.csprojに

<PropertyGroup> 
    <WebsiteName>MyWebsite</WebsiteName> 
    <WebsitePath>..</WebsitePath> 
    </PropertyGroup> 
    <Import Project="$(ProjectDir)\Website.targets" /> 
    <Target Name="BeforeBuild" DependsOnTargets="CompileWebsite"> 
    </Target> 

のようなものを追加し、あなたが行く準備ができなければなりません。 Website.targets:

<?xml version="1.0" encoding="utf-8"?> 
<!-- 
    Target that compiles Website's App_Code to be used for testing 
    --> 
<Project DefaultTargets="CompileWebsite" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
    <AppCodeFiles Include="$(WebsitePath)\$(WebsiteName)\App_Code\**\*.*" /> 
    </ItemGroup> 
    <Target Name="CompileWebsite" Inputs="@(AppCodeFiles)" Outputs="$(ProjectDir)\PrecompiledWeb\bin\App_Code.dll"> 
    <AspNetCompiler VirtualPath="$(WebsiteName)" PhysicalPath="$(WebsitePath)\$(WebsiteName)" TargetPath="$(ProjectDir)\PrecompiledWeb" Force="true" Debug="true" /> 
    </Target> 
    <Target Name="CleanWebsite"> 
    <RemoveDir Directories="$(WebsitePath)\$(WebsiteName)\PrecompiledWeb" /> 
    </Target> 
</Project> 
0

これは、Webアプリケーションにプロジェクトを変換するか、クラスライブラリプロジェクトにあなたのクラスを移動せずにApp_Codeフォルダーに保存されているユニットテストクラスに可能です。

コードファイルのビルドアクションをコンパイルに設定するだけです。これにより、Webサイトのデバッグとユニットテストで.dllファイルが出力されます。

ユニットテストプロジェクトからウェブサイトプロジェクトを参照すると、app_codeフォルダ内のクラスが表示されます。

注:Compileにあなたは.csファイルBuild Actionを設定

はあなたのウェブサイトは、デバッグと単体テストの.dllファイルを生成します。 .dllファイルは、IISがあなたのコードをbinとApp_Codeの2つの場所で見つけ、使用するコードがわからないため、Webサイトをデバッグするときに問題が発生します。私は現在、デバッグしたいときに.dllファイルを削除します。

+0

私の答えがなぜ落選したのか分かりません。ユニットテストの唯一の方法は、コードをクラスライブラリプロジェクトに移動するか、またはソリューションをWebアプリケーションに変換することであり、私の答えはapp_codeフォルダにコードを保持したまま単体テストを行う方法を示しています。私の答えが貧弱なフォーマットである場合、私はダウン投票者が彼らが嫌いなことを説明することを願っています。 –

0

PhysicalPath属性を追加してBrian Whiteのソリューションを変更する必要がありました。さらに、私はDefault Web Siteを使用しておらず、VirtualPathのプロパティを自分のウェブサイト名に変更しなければなりませんでした。

<Target Name="BeforeBuild"> 
    <AspNetCompiler VirtualPath="myIISsitename.com" PhysicalPath="$(SolutionDir)MySiteFolder" TargetPath="$(ProjectDir)\MySite_Precompiled" Force="true" Debug="true" /> 
</Target> 

たDLLは、この知識は有用であるが、それはOPがこれを行う方法を知っていることを疑問に記載されているので、私はこれが良い答えだとは思わないMySite_Precompiled\App_Code.dll

関連する問題