0

私は C++/CX タスクの初心者であり、これに夢中になっています。次のコードは、「無効なパラメーターが致命的と見なされる関数に無効なパラメーターが渡されました」という例外を生成します。私はそれがファイルを正常に作成し、そのタスクの継続に入ることを知っています(または少なくともそこに定義されたブレークポイントに到達します)、ファイルが存在しないという事実のために例外が発生することを(以前の作業に基づいて)99%確信していますXmlDocument::LoadFromFile メソッドを爆発させる有効な XML。実際にその例外をキャッチしたかったので、いくつかの MSDN ドキュメントで定義されているエラー処理の継続を作成しました。(2回目のサンプル)

    TEST_METHOD(The_storage_file_must_reference_a_valid_xml_file)
    {
        auto folder = ApplicationData::Current->LocalFolder;

        auto createFileTask = 
            create_task(ApplicationData::Current->LocalFolder->CreateFileAsync("TestFile.txt", CreationCollisionOption::ReplaceExisting))
            .then([this] (StorageFile^ file)
            {
                XmlLoadSettings^ loadSettings = ref new XmlLoadSettings();
                loadSettings->ProhibitDtd = false;
                loadSettings->ResolveExternals = false;

                auto loadXmlDocumentTask = 
                    create_task(XmlDocument::LoadFromFileAsync(file, loadSettings))
                    .then([this] (XmlDocument^ doc)
                    {
                        int x = 99;
                    });
            });
    }

エラーが継続するコードは次のとおりです....

TEST_METHOD(The_storage_file_must_reference_a_valid_xml_file)
    {
        auto cut = ref new CategoryDataLoadBuilder();
        auto folder = ApplicationData::Current->LocalFolder;

        auto createFileTask = 
            create_task(ApplicationData::Current->LocalFolder->CreateFileAsync("TestFile.txt", CreationCollisionOption::ReplaceExisting))
            .then([this] (StorageFile^ file)
            {
                XmlLoadSettings^ loadSettings = ref new XmlLoadSettings();
                loadSettings->ProhibitDtd = false;
                loadSettings->ResolveExternals = false;

                auto loadXmlDocumentTask = 
                    create_task(XmlDocument::LoadFromFileAsync(file, loadSettings))
                    .then([this] (task<XmlDocument^> t)
                    {
                        try
                        {
                            t.get();
                        }
                        catch (COMException^ ex)
                        {
                            int x = 99;
                        }
                    });
            });
    }

このテストをデバッグしようとすると、テスト エンジンでアクセス違反が発生し、多くの場合、デバッガーが雑草の中に消えてしまったように見えます。

エラー継続のしくみについて誤解していますか? VS Test エンジンでは動作しませんか? テストで明示的にチェックできる XML ファイルが悪い場合に生成される「実際の」例外をチェックするより良い方法はありますか?

前もって感謝します

4

1 に答える 1

1

いくつかの追加の調査と理解の後、私はこのブログ投稿に出くわしました: http://w8md.wordpress.com/2012/09/26/async-unit-tests-in-ccx/ . MSDN フォーラムへのリンクをたどるHow to use async function in unittest project by c++? これは MS Test フレームワークではサポートされていません。この記事で紹介したソース コードは問題なく動作します。実験として、コードを抽出してイベントをポンプし、テストを実行することができました。(もちろん、オリジナルの作者のソース コードを使用/変更することをお勧めします。)

(余談ですが、私は自分の質問に答えるのが非常に不快ですが、他に何をすべきかわかりません。)

于 2013-01-03T06:26:35.113 に答える