web-dev-qa-db-ja.com

XMLファイルがテスト出力ディレクトリにコピーされない

Visual Studio 2010、x64マシン、組み込みのWebサーバーを使用して、組み込みのテストフレームワークを使用する単体テストのセットでWCFサービスをホストします。

テストを実行するためにロードする必要のあるXMLファイルがあります。このファイルをテストプロジェクトに含め、「content」と「always copy to output directory」に設定したファイルを用意しました。このファイルはbin\debugディレクトリに正常にコピーされます。

しかし、テストを実行すると、xmlファイルがありません。プロジェクトのbin\debugフォルダーではなく、テストの作業ディレクトリC:\ Projects\SAP Reapprovals\TestResults\name_machine 2010-12-06 13_45_43\Out "で検索されます。ファイルはそこにコピーされていません。

このファイルを強制的にコピーする方法はありますか、またはテスト内から参照を完全に修飾する必要がありますか?

TIA!
ジェームズ


更新
DeploymentItem属性を設定しましたが、ファイルがまだコピーされません。しかし、それは確かに私が望むもののように見えます...なぜそれがうまくいかないのですか?

私のテストコード:

[TestMethod]
[DeploymentItem("SAP - GS3 format.xml")]
public void TestProcessSapRoles() {

    //  I get a 'file not found' error here, and when 
    //  I check the output directory, it isn't there
    XElement rolesRoot = XElement.Load("SAP - GS3 format.xml");

}


回答:
CPedrosに感謝します。彼の助けを借りて、これを少し拡大しました。 SysInternalsのProcess Monitorを実行して、xmlファイルを探している場所を確認しました。これが私が見つけたものです:

Ctrl + r、ctrl + t(現在のコンテキストでのデバッグテスト)を使用してテストを実行すると、 ビジュアルスタジオ無視されたDeploymentItem 完全に属性 そしてもしませんでした 試す ファイルをどこかにコピーします。この場合、読み取り用に開こうとしたときに「ファイルが見つかりません」という例外が発生しました。 Visual Studioはテスト用の一時作業ディレクトリを作成しましたが、そこにはAgentRestart.datという1つのファイルしかありませんでした。

ツールバーの[ユニットテストの実行]ボタンを使用してテストを実行すると(どのテストオプションかはわかりません)、Visual Studioはファイルをコピーせず、プロジェクトディレクトリから直接参照しました。テストに合格し、一時的な作業ディレクトリは作成されませんでした。

メニューオプションの[実行->現在のコンテキストでテスト](デバッグではなく実行)からテストを実行すると、一時作業ディレクトリが作成され、xmlファイルとすべての実行可能ファイルがそこにコピーされました。テストに合格しました。

Local.testsettings(testsフォルダーの下のSolution Itemsフォルダーの下)を編集したとき、左側のメニューから[Deployment]を選択し、xmlファイルを追加しました。 [ソリューションディレクトリ]\[プロジェクトディレクトリ]\file.xmlとして追加されました。 DeploymentItem属性を削除しました。これで、テストをデバッグすることができました。 xmlファイルとすべての実行可能ファイルは、テスト用に作成された一時ディレクトリにコピーされました。

TLDR: Visual Studioは、テストを実行する特定の方法でDeploymentItem属性を無視しています。解決策は、Local.testsettingsDeploymentメニューを編集し、ファイルを手動で追加することです。

助けてくれてありがとう!これを解決するのに最も役立つので、彼の答えはCPedrosに感謝しています。

41
James King

DeploymentItem属性を使用してテストに注釈を付けてみてください: http://msdn.Microsoft.com/en-us/library/Microsoft.visualstudio.testtools.unittesting.deploymentitemattribute(v = VS.100).aspx

ドキュメントのコードスニペットは次のとおりです。

  [TestClass]
    public class UnitTest1
    {
        [TestMethod()]
        [DeploymentItem("testFile1.txt")]
        public void ConstructorTest()
        {
            // Create the file to deploy
            Car.CarInfo();
            string file = "testFile1.txt";
            // Check if the created file exists in the deployment directory
            Assert.IsTrue(File.Exists(file), "deployment failed: " + file +
                " did not get deployed");
        }
    }
20
Pero P.

Local.testSettingsにファイル名を入力してプロパティを「常にコピーする」に設定しても、ファイルの1つがoutフォルダーにコピーされないという問題に直面していました。

次の手順で問題が解決しました:

  1. テストメニューを開く
  2. テスト設定を選択
  3. オプション「テスト設定ファイルの選択」を選択します
  4. [設定ファイルを開く]ウィンドウから.testsettingsファイルを選択します
  5. 選択した.testsettingsファイルがテスト->テスト設定でチェックされていることを確認してください

これが誰かを助けることを願っています。

0
CSharp

私はしばらくの間、デプロイメント属性に取り組んできましたが、ついに諦めました。代わりに、ファイルを手動でテストディレクトリにコピーし、終了したら削除します。

テストファイルの場所:

Private _locationOfTestFilesToBeCopied As String = "C:\...\TestFilesToBeCopied"
Private _locationOfTestFiles As String = "C:\...\TestFiles"

メソッドの初期化:

<TestInitialize()>
Public Sub Setup()
    DeleteCopiedTestFiles()
    CopyTestFilesToTestDirectory()
End Sub

メソッドのコピーと削除:

Private Sub CopyTestFilesToTestDirectory()
    Dim sourceDirectory As New DirectoryInfo(_locationOfTestFilesToBeCopied)

    For Each fileInfo As FileInfo In sourceDirectory.GetFiles
        fileInfo.CopyTo(_locationOfTestFiles & "\" & fileInfo.Name, True)
    Next

    sourceDirectory = Nothing
End Sub

Private Sub DeleteCopiedTestFiles()
    Dim sourceDirectory As New DirectoryInfo(_locationOfTestFiles)

    For Each fileInfo As FileInfo In sourceDirectory.GetFiles
        fileInfo.Delete()
    Next

    sourceDirectory = Nothing
End Sub

私はこれがうまくいくことを発見しました

0
majjam

xmlファイルを必要とするテストでこの属性を使用することを検討してください。

http://msdn.Microsoft.com/en-us/library/Microsoft.visualstudio.testtools.unittesting.deploymentitemattribute.aspx

0
poindexter12