我是C ++ / CX任务的初学者,这让我疯狂。以下代码生成异常“将无效参数传递给认为无效参数致命的函数”。我知道它成功创建了文件并进入该任务的延续(或者至少命中了那里定义的断点),并且我99%肯定(基于之前的工作)由于文件不是这样的事实而发生异常有效的XML导致XmlDocument :: LoadFromFile方法爆炸。我想尝试实际捕获该异常,因此我构建了一个错误处理延续,如几个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测试引擎中不起作用吗?有没有更好的方法来检查XML文件坏的时候生成的“真实”异常,我可以明确检查我的测试?
提前致谢
答案 0 :(得分: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框架不支持这一点。文章中提供的源代码工作正常。作为一个实验,我提取代码以泵送事件,并能够运行测试。 (当然,我建议使用/修改原作者的源代码。)
(顺便说一下,回答我自己的问题我感到非常不舒服,但我不知道还能做些什么。)