2009-08-24 14 views
4

私のビルドサーバはMSBuildを使用してアプリケーションをビルドします。私たちの単体テストはテストのためにいくつかのプライベートメンバーにアクセスする必要があるので、組み込みのプライベートアクセサリーを使用します。 Visual Studioはそれで問題ありませんが、我々はビルドサーバーへの我々のコードをプッシュするときに我々は、エラーを取得:MSBuildを使用するとプライベートアクセサが作成されない

MyTest.cs (96,13): errorCS0246: The type or namespace name 'My_Accessor' could not be found (are you missing a using directive or an assembly reference?)

なぜそれがMSBuildのプライベートアクセサを無視し、どのように私はそれを修正することができるということですか?

当社のテストフレームワークにはNUnitを使用し、継続的インテグレーションサーバーにはCruiseControl.Netを使用します。

EDIT: コメントごとに、リポジトリパターンクラスの基本クラスのテストコードを次に示します。

MockRepository mocks = new MockRepository(); 

IDataContextWrapper wrapper = mocks.DynamicMock<IDataContextWrapper>(); 

Repository_Accessor target = new Repository_Accessor(wrapper); 
Assert.AreEqual(wrapper, target._DataContext); 

このコードは、単にメンバ変数がモックラッパーに設定されている_DataContextことを検証します。ビルドサーバーでMSBuildを使用してビルドすると失敗します。

+1

プライベートアクセサがユニットテストとやりとりする方法を示すコードを表示することができます。ただし、アセンブリ参照がMSBuildの設定にないと思われます。 –

+0

私は、どのように私のアクセサを使用しているかについてのアイデアを与えるべきであるいくつかの簡単なコードを入れました。 – Odd

+0

あなたの開発マシンのMSBuildを使ってビルドしようとしましたか?これはMSBuildに問題があるのか​​、ビルドサーバーの設定に問題があるのか​​を把握するのに役立ちます。 –

答えて

0

メフメットの答えは、ビジュアルスタジオをインストールすることでこれを動作させることができた唯一の方法ではないかと思います。これがインストールされると、msbuildが私のアクセサを生成し始めました。理想的な解決策ではありませんが、少なくとも私は前進することができます。

0

[assembly:InternalsVisibleTo]がビルドシステムで正しくローカルに正しく設定されていますか?

(さらに、Assert.AreSame()が適切かもしれません)。

+0

[assembly:InternalsVisibleTo]の値を確認するにはどうすればよいですか? – Odd

+0

AssemblyInfo.csファイルで定義される可能性が最も高い – anthony

+0

ビルドサーバーと開発環境の間で共有されるソースはまったく同じなので、これは問題ではありません。 – Odd

1

ビルド設定でプライベートアクセサアセンブリが生成されていないようです。結果として、指示またはアセンブリ参照エラーを使用して、その欠落が発生しています。 Publicizeツールを見て、ビルドプロセス中にプライベートアクセサを生成することができます。そこに記載されている

The generated assembly is also known as a private accessor. You can also generate private accessors from the IDE, but you might use publicize.exe instead in Automation, scripting, and build scenarios.

私はいくつかのテストでプライベートアクセサも使用し、TFS TeamBuildとMSTestを使用します。プライベートアクセサはビルド中に生成されます。私は手動で何もする必要はありませんでした。

+0

私は今日これを打つつもりです、それはおそらく原因となる可能性があると聞きます – Odd

+0

それはうまくいくかもしれませんが、それは私が何をしているかではありません。アクセサーを含むDLLを生成することはできますが、これをソリューションにリンクすることは非常に困難です。私はそれが動作するかどうかを確認するために今Visual Studioをインストールしようとしています。 – Odd

0

私はあなたがユニットテストのために一部のプライベートメンバーを公開するためにReflectionを使用していると仮定しました。

これが当てはまる場合、はプライベートメンバーに覗き見て、一定の権利を付与する必要があることを理解する必要があります。そうでなければ、悪意のある.NETプログラムは、必要なアセンブリがあれば何でも望むものを改ざんする可能性があります。

あなたはクルーズコントロール、ユーザーが下で実行されていることを確認され、その後、ビルドランナーとテストランナーCruiseControlの打ち上げは、.NETランタイムから「 ReflectionPermission」または「完全な信頼」を与えられているアカウントで実行されていますか?

私が探している/ googleの場所はmachine.configビルドサーバーで設定されています.Curise Control独自のweb.config(これは長い間CCを使用していないため、テストランナーとテスト対象のアプリケーションの両方のapp.configファイルを使用します。

それ以外の場合は、Publicizeツールを@Mehmet Arasの提案に従って使用することをお勧めします。

関連する問題