XNA项目单元测试,构建成功但在运行测试时出现错误。

4
我正在为一个XNA项目设置单元测试。在确保测试项目在配置管理器中设置为构建并删除对XNA内容项目的引用之后,我终于成功构建了测试。

但是测试仍然有一半的时间无法运行。如果我从测试视图中点击“运行选择”,我会不断收到错误消息“No such interface supported (Exception from HRESULT:0x80004002 (E_NOINTERFACE))”。如果我按下“运行解决方案中的所有测试”按钮,有时它会运行,但通常会出现此错误:“Specific Cast is not Valid.”如果“运行所有测试”第一次起作用(这似乎是在更新SVN后发生),那么它在那之后立即停止工作。

我找到了一些遇到类似问题的人:

http://connect.microsoft.com/VisualStudio/feedback/details/602985/unit-testing-does-not-work-with-xna-4-0

http://social.msdn.microsoft.com/Forums/en-US/vsunittest/thread/175cb376-9846-40fa-9197-50595cd32200/

但是两者似乎都没有得到解决。任何帮助都将不胜感激。

能否发布一些代码?甚至是整个项目的压缩包? - scottheckel
3个回答

3

默认的XNA解决方案不可用于COM。测试框架似乎在COM环境下表现更好。最简单的修复方法是打开AssemblyInfo.cs文件,找到以下行:

[assembly: ComVisible(false)]

将false更改为true。

Carlos Quintero的一篇博客文章帮助我找到了解决方法。这种方法只有在一半的情况下有效,而且我并不确定它是否负责解决问题。

Aaron Stebner在论坛帖子中声称,如果测试项目引用ContentProject并且引用WPDT发布说明,则根本不应该工作。在我的测试中,游戏项目本身必须不引用ContentProject才能使测试每次都成功运行。我已经开始删除引用以运行测试,然后再进行替换。根据您的测试覆盖范围,这可能效果很好或是无用的,但看起来这是我们可以使用内置测试套件获得的最佳结果。


1

我知道这有点烦人,但如果你右键点击测试项目并选择调试->启动新实例,它应该会构建并运行测试。烦人的是,由于你正在调试,任何失败的断言都会暂停执行。不过你可能需要这个功能,所以这并不是一个大问题


是的,这就是我们过去几周必须要做的事情。虽然还有更糟糕的命运,但让事情变得更糟糕的一件事是ExpectedException似乎也不起作用(我现在不记得原因了)。所以我必须在测试中捕获异常,并且每个像这样的测试都会出错。 - AJD
@AJD - 在文档的备注部分有关于ExpectedException行为的一些注释。也许它们可以解决你的问题。 - Richard Marskell - Drackir

0
在某些情况下,可以将目标代码隔离在普通的.NET类库项目中,并仅从测试项目引用该类库。这样,由于不引用XNA项目,通常的测试功能可以正常工作。

你能解释一下如何做到这一点吗? - AJD
@AJD - 我认为他的意思是,如果你的代码不需要使用XNA类,或者例如,如果你将Vector2分解成两个浮点数。但是,这样一来,你就没有真正测试相同的代码,这可能会引入更多的错误,并且可能会错过其他错误。 - Richard Marskell - Drackir
正如Richard所解释的那样,如果可以将要测试的代码移动到一个单独的非XNA程序集中,那么你的测试代码就不需要引用XNA了。这就是我正在处理的代码所做的。我的核心函数在库A中,我的测试在ATest中,它引用A,而我的“游戏”在程序集B中,只引用A。然后,ATest可以很好地使用通常的测试工具。 - Gorkem Pacaci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接