48

ASP.net Web サイト プロジェクト (.net 3.5) があります。現在、非コード ビハインド コード ファイル (Linq2Sql のもの、データ コンテキスト、ビジネス ロジック、拡張メソッドなどを含む) はすべて、App_Code フォルダーにあります。

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

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

これは正しいです?または、プロジェクト全体を再構築/リファクタリングせずに単体テストできる別の方法はありますか?

4

8 に答える 8

24

私のショップは、MVCプロジェクトのこれに対する答えを最終的に解決しました。そして、ここ StackOverflow で多くの行き詰まりを追跡したので、それを共有したいと思います。次のようにします。

  • インテリセンスとデバッグが適切に機能する「ローカルiisからのWebサイトとして」MVCフォルダーを開きます
  • ソース管理されたディレクトリに存在する単体テスト プロジェクトを追加します。
  • Web サイトとして開いているプロジェクトには追加できないため、ビルド前のステップを TEST プロジェクトに追加します。Web サイトが \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 への参照を追加します。
  • ブームそれだけです。ケーキを持って食べることもできます。ソリューションで [ビルド] をクリックするたびに、Web サイトの csproj (まだ存在します) で aspnet_compiler.ext ツールを呼び出します。これは、MSBuild とは異なり、app_code をコンパイルできます。Debug="true" を使用すると、app_code にステップ インできます。単体テストをデバッグするときの dll コード。また、更新された単体テストを実行している場合にのみビルドする必要があります。ページでの変更の影響を確認するときは、web サーバーから呼び出されたときに app_code フォルダーが動的にコンパイルされるため、コードを変更/保存/ページを更新するだけです。
于 2012-04-30T15:43:46.973 に答える
19

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

于 2009-07-29T07:38:32.533 に答える
12

私の会社でこの問題が発生しています (私の上司は DLL が好きではなく、バージョン管理についてのゴミがいくつかあります...)

頻繁に使用する 2 つの方法があります。

1) 単体テストを行うための CI ツールを入手します。NUnit との統合が非常に緊密な TeamCity を使用します。ソリューションは、これが有効なオプションであるのに十分な速さで構築されます (そして十分なテストがほとんどありません)。

2) 結果のバイナリを手動でプリコンパイルして単体テストする: コマンド ラインから ASP.net コンパイラ/MSBuild を実行し ('Publish' ビルドを行っているかのように)、結果のバイナリを単体テストすることは完全に可能です。

ただし、コードをバイナリ (クラス ライブラリ) に分離するか、単に Web アプリケーションを使用するオプションがある場合は、より良い代替手段としてお勧めします。

于 2010-06-21T11:32:05.687 に答える
6

誰かが Brian のソリューションを実装していることに気付いた場合は、単体テスト ソリューションに含めることができる Website.targets ファイルを次に示します。App_Code が変更された場合にのみ Web サイトを (再) コンパイルします。のようなものを追加するだけです

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

あなたの .csproj に、カスタマイズWebsiteNameしてWebsitePath、準備ができているはずです。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>
于 2013-06-04T08:17:32.590 に答える
2

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

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

于 2009-07-29T08:06:54.487 に答える
1

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

于 2009-07-29T08:00:06.343 に答える
0

プロジェクトを Web アプリに変換したり、クラスをクラス ライブラリ プロジェクトに移動したりしなくても、App_Code フォルダーに格納されているクラスを単体テストできます。

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

これで、単体テスト プロジェクトから Web サイト プロジェクトを参照すると、app_code フォルダー内のクラスが表示されます。

ノート:

.cs ファイルBuild Actionを に設定Compileすると、Web サイトはデバッグと単体テストで .dll ファイルを生成します。.dll ファイルは、Web サイトをデバッグするときに問題を引き起こします。これは、IIS が bin と App_Code フォルダーの 2 つの場所でコードを検出し、どちらを使用すればよいかわからないためです。現在、デバッグしたいときに .dll ファイルを削除するだけです。

于 2016-05-26T21:06:55.013 に答える