1

我正在创建一个 MonoGame 项目,并希望针对现有代码创建单元测试。我创建了一个测试项目,并从 GameLopp 类的简单测试开始(我对项目附带的 Game1.cs 类的重命名)。我创建了一个基本的“设置成功”测试,以确保构造函数构建没有问题:

    public GameLoopTest()
    {
        using (GameLoop game = new GameLoop())
        { game.Run(); }
    }

    public void Dispose()
    {
        _gameloop = null;
    }

    [Fact]
    public void GameLoop_Setup_Suceeds()
    {
        this.Should().NotBeNull();
    }

令我困惑的是,测试中的构造函数抛出了 NullReference 异常。如果我在调试模式下逐步完成测试,我会得到一个更详细的异常,告诉我找不到 GraphicsDeviceManager。我进行了广泛搜索,但我无法想出错误发生的原因或如何解决。

我在那个类中没有很多代码,但我不想让单元测试发现如此重要的东西。

4

1 回答 1

3

看一下 MonoGame 中 Game 类的实现。

https://github.com/mono/MonoGame/blob/develop/MonoGame.Framework/Game.cs

在构造函数中,它创建一个 GameServiceContainer,然后在 GraphicsDevice getter 中使用它来获取 IGraphicsDeviceService。

为了使事情变得更加困难,GraphicsDeviceManager 在其构造函数中采用了一个 Game 类,并将自身作为服务添加到服务容器中,从而在这两个类之间建立了紧密的耦合。

https://github.com/mono/MonoGame/blob/develop/MonoGame.Framework/GraphicsDeviceManager.cs

这对于单元测试来说不是特别好的设计,但这不是 MonoGame 团队的错,因为他们只是重新实现了 Microsoft XNA 的行为。

我怀疑您的问题是您的 GameLoop 类依赖于已经构造了一个有效的 Game 类,该类又在内部使用服务容器。

我的建议是设计您自己的代码,以便可以对其进行单元测试,并尝试以将视图与视图模型分离的相同精神将其与渲染代码分离。充其量,如果您真的很热衷,您也许可以使用屏幕截图测试来确认事物是否正确呈现。

于 2013-04-29T00:10:25.793 回答