2013-04-28 2 views
1

MonoGame 프로젝트를 만들고 기존 코드에 대해 Unit Tests를 만들고 싶습니다. 테스트 프로젝트를 만들고 GameLopp 클래스 (게임과 함께 제공되는 Game1.cs 클래스의 My Rename)에 대한 간단한 테스트로 시작했습니다.Monogame은 단위 테스트에서 Game 생성자를 호출 할 수 없습니다.

내 혼란에
public GameLoopTest() 
    { 
     using (GameLoop game = new GameLoop()) 
     { game.Run(); } 
    } 

    public void Dispose() 
    { 
     _gameloop = null; 
    } 

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

많은 시험의 생성자는 NullReference 예외를 throw : 나는 기본 테스트가 문제없이 생성자 빌드보다 특정하기 위해 '설치 성공'만들었습니다. 디버그 모드에서 테스트를 수행하면 GraphicsDeviceManager를 찾을 수 없다는 자세한 예외가 발생합니다. 나는 광범위하게 검색했지만 오류가 발생하는 이유 또는 해결 방법을 생각해 낼 수 없었습니다.

나는 그 클래스에 많은 코드가 없지만, 유닛 테스트에서 밝혀진 중요한 것을 남겨 두는 것을 싫어한다.

+0

생성자를 확인하는 테스트를 사용하는 것이 약간의 반 패턴이지만, 문제를 일으키는 테스트 관련 코드가 아니라는 것을 확인하는 가장 좋은 방법 인 것처럼 보입니다. – ChargerIIC

+0

어떤 종류의 IoC/Dependency Injection 프레임 워크를 사용합니까? (당신은 무엇을 사용합니까?). 테스트를 할 때 IoC 설정을 돌봐야합니까? –

+0

Xunit/FluentAssertions 사용. Mocking을 위해서 나는 NSubsitute를 얻었습니다. 그저 그 Monogame. 내가 Dependency Injection 자체를 사용하는 것에 익숙하지 않다는 것을 나는 믿지 않는다. – ChargerIIC

답변

3

MonoGame에서 Game 클래스의 구현을 살펴보십시오. 생성자에서

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

IT는 GameServiceContainer을 생성 한 다음 IGraphicsDeviceService 얻을 GraphicsDevice를 게터에 사용.

GraphicsDeviceManager는 생성자에서 Game 클래스를 가져 와서 서비스 컨테이너에 서비스로 추가하여이 두 클래스 간의 긴밀한 결합을 만듭니다.

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

이것은 단위 테스트에 특히 좋은 디자인은 아니지만 그들은 단지 마이크로 소프트 XNA의 동작을-구현 다시 때문에 그것은 MonoGame 팀의 잘못이 아니에요.

귀하의 GameLoop 클래스가 내부적으로 서비스 컨테이너를 사용하는 유효한 Game 클래스가 이미 구성되어 있는지 여부에 따라 문제가 발생한 것으로 생각됩니다.

제 제안은 단위 테스트를 할 수 있도록 코드를 디자인하고 뷰 모델과 뷰를 분리하는 동일한 정신으로 코드 렌더링을 분리하려고 시도하는 것입니다. 기껏해야, 스크린 샷 테스트를 사용하여 실제로 예민한 경우 올바르게 렌더링되는지 확인할 수 있습니다.

+0

그래픽 장치 관리자를 처리하기 위해 일부 코드 저글링이 필요하지만 솔루션이 올바르게 작동합니다. – ChargerIIC

관련 문제