2010-07-25 4 views
0

이 질문은 following topic의 계속 부분입니다. (읽을 필요는 없습니다.) TDD로 구현하고있는 테트리스 게임 일뿐입니다.args 생성자없이 TDD가있는 설정자없이 façade 클래스를 테스트하는 방법은 무엇입니까?

그래서 여기에 문제가 있습니다. 나는 수락 테스트를 받았습니다.

[TestMethod] 
public void I_Can_Query_Any_Piece_Of_The_Board_For_A_Color() { 
    StandardTetris tetris = new StandardTetris(); 

    for (int y = 0; y < tetris.BoardSize.Height; ++y) { 
     for (int x = 0; x < tetris.BoardSize.Width; ++x) { 
      Color color = tetris.GetColorAt(x, y); 

      Assert.IsTrue(
       color == Color.Cyan || 
       color == Color.Blue || 
       color == Color.Orange || 
       color == Color.Yellow || 
       color == Color.Green || 
       color == Color.Violet || 
       color == Color.Red 
       ); 
     } 
    } 
} 

내가 좋아하는 거라고 내가

public Color GetColorAt(int x, int y) 
{ 
    return Color.Orange; 
} 

다음 시험에 StandardTetris

public Color GetColorAt(int x, int y) 
{ 
    return Color.Black; 
} 

에했던 방법을 변경했다 : 나는 그들 중 하나에 다음 테스트를 정의 몇 가지 픽셀을 몇 가지 색상으로 설정 한 다음, 내가 놓은 위치에서 색상이 맞는지 확인했습니다 (이제는 생각하니 수락 테스트가 아닙니다). 어떻게하면됩니까? StandardTetris는 보드 조각에 대한 어떤 종류의 setter도 제공하지 않습니다 (그렇게하지 않아도됩니다!). 기본 생성자가 아닌 다른 생성자를 갖고 싶지 않습니다. 그럼 내가 어떻게 조롱 할 수 있니?


StandardTetris의 현재 코드입니다 : 내가 삽입 할 IOC의 라이브러리를 사용했을

[TestMethod] 
    public void Set_A_Blue_2x2_Square_On_Origin_And_Query_It_Sucessfully() { 
     Board board = new Board(); 
     board.SetColorAt(0, 0, Color.Blue); 
     board.SetColorAt(0, 1, Color.Blue); 
     board.SetColorAt(1, 0, Color.Blue); 
     board.SetColorAt(1, 1, Color.Blue); 

     Tetris tetris = new Tetris(board); 

     Assert.AreEqual(Color.Blue, tetris.GetColorAt(0, 0)); 
     Assert.AreEqual(Color.Blue, tetris.GetColorAt(1, 0)); 
     Assert.AreEqual(Color.Blue, tetris.GetColorAt(0, 1)); 
     Assert.AreEqual(Color.Blue, tetris.GetColorAt(1, 1)); 
    } 
+1

계단식 생성자를 사용할 수 있습니까? 소비 클래스가 기본 구현에 대해 걱정하지 않기를 바란다면 자주이 작업을 수행하지만 책임을 분리하고 디자인을 깨끗하고 유지 보수 할 수 있기를 원합니다. – Lunivore

+0

흠, 제 아이디어는 그것들을 사용할 필요가 없었습니다. 그것이 유일한 방법이라면 :(. 내 주요 문제는 여기에 "우리는"내가 StandardTetris 안에 게시판 클래스를 집어 넣어야한다는 것을 알고 있지만, TDD (그리고 setter가없는 방법)) –

답변

1

을 배치 할 수 있습니다 2) 시험 :

  • 가 만들기를 두 번째 생성자에서는 미리 구성된 정보를 전달할 수 있습니다.

  • StandardTetris에서 상속받은 테스트 클래스 TestStandardTetris에는 미리 구성된 정보를 얻기위한 생성자가있는 유일한 테스트 클래스 TestStandardTetris을 만듭니다.

귀하의 테스트는 당신이 상태를 설정하는 방법이 필요하다는 것을 당신에게 말하는, 당신은 당신이, 상태 변경 세터의 따라서 부족을 원하지 않는 말을하는지, 그래서 유일한 장소 왼쪽 상태를 설정하는 것은 생성자입니다.

첫 번째 옵션은 게임의 기본 API를 엽니 다.

에서 상속 받기로 결정한 이후 API를 사용하는 사용자는 테스트를 위해 열어야하며 변경된 사항이 유일한 경우에는 StandardTetris의 기능을 테스트 할 수 있습니다. TestStandardTetris

다른 방법이 더 좋을 수 있으므로 다른 사람이 더 좋은 대답을 내놓을 때까지 기다려주세요. :)

+0

좋아요, 나는 생성자에서 물건을 전달해야하는 데 전혀 문제가 없습니다 (내부로 정의하므로 동일한 어셈블리에서만 액세스 할 수 있으므로 최종 사용자에게는 사용 가능한 생성자가 하나만 표시됨) ,이 일을하는 다른 방법이있을 거라 생각했습니다. 그러나 모든 사람들이 같은 방향을 가리키고있는 것처럼 보입니다. –

+0

나는 원래 게시물을 편집했는데, 그 테스트는 당신에게 잘 보이나요? 타이 –

0

:

public class StandardTetris 
{ 
    private static readonly int BOARD_WIDTH = 10; 
    private static readonly int BOARD_HEIGHT = 22; 

    private Size boardSize = new Size(BOARD_WIDTH, BOARD_HEIGHT); 

    public Size BoardSize { get { return boardSize; } } 

    public Color GetColorAt(int x, int y) 
    { 
     return Color.Orange; 
    } 
} 

당신의 제안을 사용하여, 나는 다음과 같은 시험을했다 Board 인스턴스를 생성자를 통해 StandardTetris 인스턴스에 추가합니다. 그런 다음 테스트 메소드에서 수동으로 StandardTetris 인스턴스를 만들 수 있습니다. 조롱 된 보드는 원하는대로 반환합니다. 시험 방법에서 다음

public class StandardTetris 
{ 
    IBoard _theBoard; 
    public StandardTetris(IBoard boardInstance) 
    { 
    _theBoard = boardInstance; 
    } 
} 

:

런타임 코드에서
StandardTetris tetris = new StandardTetris(new MockBoard()); 

당신은 단지 런타임 보드 클래스 :

를 해결하기로 IBoard 인터페이스를 등록 한 후 IOC의 라이브러리에이를 통과 할 것
StandardTestris tetris = new IoCContainer.Resolve<StandardTetris>(); 
+0

IoC Containers 나 그런 것을 사용하고 싶지 않습니다. 지금 TDD를하는 법을 배울 때 한 가지 문제가 있습니다. IoC를 혼합하면 2 가지 문제가 생깁니다. TDD 학습 및 방법 편집 : 나는 어렵다는 말은 아니며 프레임 워크없이 TDD를 다루는 법을 배우기를 원하며 사용을 시작한 후에야 가능합니다. –

+0

그러면 IoC *를 처음부터 배울 것입니다. TDD에 대한 믿을 수 없을만큼 유용한 도구 (나를 위해 TDD가 IOC을 사용하는 주된 이유입니다.) –

1

픽셀 수가 저조한 것으로 보입니다. 보드상의 조각에 대해 말하면 보드의 특정 그리드 위치에 모양이 있는지 테스트해볼 것입니다. 우리가 보드를 다루려고 할 때 보드에 대해 다음과 같은 테스트를 할 것입니다.

1) 보드의 특정 위치에 모양이 있는지 테스트하십시오. (TShape은 테트리스의 그 T 모양을 의미하는이 분명 희망;))

public void TestHasTShapeAtCoordinates() 
    Assert.isEqual(board.shapeAt(1,2), TShape.new) 
    end 

나는 두 가지 옵션을 참조하십시오 tshape

+0

죄송합니다. 픽셀을 말하면 보드에 조각이 있다는 의미 일 때. –

+0

GUI를 테스트하는 척하지 않습니다. 문제는 무엇인지 알지 못했습니다. 문제는 게임 보드에서 T를 전나무에서 st 장소. –

+0

나는 원래의 포스트를 StandardTetris의 현재 코드로 편집했다. 다른 스레드 (Board 클래스를 구현 한 곳)를 잊어 버리자. 지금 가정 해 봅시다. 저는 이것을 가지고 있습니다. –

관련 문제