在单元测试中访问XNA ContentManager



我是XNA游戏开发新手,刚刚开始编写一款小型3D游戏。我已经写了几个单元测试来测试我的代码,但我遇到了一个问题。当我想对需要访问模型的模块进行单元测试时,我还没有找到一种方法来创建一个ContentManager来加载模型。在一个合适的游戏中,ContentManager是由框架提供的。在我的单元测试中,我必须自己创建它,但我不知道如何做到这一点。

使用ContentManager加载模型的另一种方法是通过编程方式创建模型对象,但这似乎相当乏味。另一种选择是模拟模型使用,例如Moq,但这似乎同样乏味。

有其他人遇到这个问题并解决了吗?

对XNA项目进行单元测试是一个常见的问题,也是经常讨论的问题。通常,问题是由于需要访问Game, GraphicsDevice或(在您的情况下)ContentManager的实例,并且没有任何简单的方法获得一个。

你可以在这里、这里和这里看到相关的讨论。

我相信普遍接受的做法是重新评估你要测试的东西,看看你是否真的需要这些引用,或者你是否能找到一种绕过它们的方法。

如果做不到这一点,你的测试案例是否能够被游戏测试充分覆盖?

如果以上两种情况都不适用,模仿对象可能会被证明是相当困难的,因为它们的父类/接口对它们提出了要求,但我听说有人这样做。我也听说实际上可以使用不可见的形式创建GraphicsDevice,但我自己还没有这样做过。

对于我自己的测试,我没有测试任何图形元素(绘图,资源加载等)。它确实在我的代码覆盖率中留下了一点漏洞,但是在花了几天时间寻找解决这个问题的方法之后,没有找到任何答案,我决定测试我的库函数(无论如何,它在我的项目中做了大部分工作)已经足够好了。

这个答案中的代码解释了如何创建ContentManager的独立实例。