Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Monogame无法在单元测试中调用游戏构造函数_C#_Unit Testing_Constructor_Xunit_Monogame - Fatal编程技术网

C# Monogame无法在单元测试中调用游戏构造函数

C# Monogame无法在单元测试中调用游戏构造函数,c#,unit-testing,constructor,xunit,monogame,C#,Unit Testing,Constructor,Xunit,Monogame,我正在创建一个MonoGame项目,并希望针对现有代码创建单元测试。我创建了一个测试项目,并开始了Gamelop类的简单测试(我对项目附带的Game1.cs类的重命名)。我创建了一个基本的“安装成功”测试,以确保构造函数的构建没有问题: public GameLoopTest() { using (GameLoop game = new GameLoop()) { game.Run(); } } public void Dispo

我正在创建一个MonoGame项目,并希望针对现有代码创建单元测试。我创建了一个测试项目,并开始了Gamelop类的简单测试(我对项目附带的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。我到处寻找,但我一直无法找出错误发生的原因或解决方法


我在这个类中没有太多的代码,但我不想让单元测试发现如此关键的东西。

看看MonoGame中Game类的实现

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

为了让事情变得更加困难,GraphicsDeviceManager在其构造函数中引入了一个游戏类,并将自己作为服务添加到服务容器中,从而在这两个类之间创建了紧密耦合

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

我怀疑您的问题在于您的GameLoop类依赖于已经构建的有效游戏类,而该类又在内部使用服务容器


我的建议是设计您自己的代码,以便可以对其进行单元测试,并尝试以将视图与视图模型分离的精神将其与呈现代码分离。充其量,如果你真的感兴趣的话,你可以使用屏幕截图测试来确认事情是否正确呈现。

我知道使用测试来验证构造函数有点反模式,但这似乎是验证它不是导致问题的测试特定代码的最佳方法。你使用什么样的IoC/依赖项注入框架?(你用什么?)。在测试时,您可能需要注意IoC的设置?使用Xunit/FluentAssertions。因为嘲笑,我得到了一个替代品。除此之外,这只是一场游戏。我认为我不熟悉依赖注入本身的使用。告诉调用堆栈异常。这可能会泄露一些细节。解决方案确实有效,尽管处理图形设备管理器需要一些代码杂耍。