문제

Dunit과 함께 단위 테스트를하는 수업이 있습니다. 몇 가지 방법과 개인 방법이 있습니다.

type
  TAuth = class(TDataModule)
  private
    procedure PrivateMethod;
  public
    procedure PublicMethod;
  end;

이 클래스에 대한 단위 테스트를 작성하려면 모든 방법을 공개해야합니다.

여전히 테스트 할 수는 있지만 공개적이지 않도록 개인 방법을 선언하는 다른 방법이 있습니까?

도움이 되었습니까?

해결책

당신은 그들을 공개 할 필요가 없습니다. 보호 된 것은 할 것입니다. 그런 다음 단위 테스트를 위해 클래스를 하위 유형화하고 보호 된 방법을 표면 할 수 있습니다. 예시:

type
  TAuth = class(TDataModule)
  protected
    procedure MethodIWantToUnitTest;
  public
    procedure PublicMethod;
  end;

이제 장치 테스트를 위해 하위 유형을 수행 할 수 있습니다.

interface

uses
  TestFramework, Classes, AuthDM;

type
  // Test methods for class TAuthDM
  TestAuthDM = class(TTestCase)
     // stuff
  end;

  TAuthDMTester = class(TAuthDM)
  public
    procedure MethodIWantToUnitTestMadePublic;
  end;

implementation

procedure TAuthDMTester.MethodIWantToUnitTestMadePublic;
begin
  MethodIWantToUnitTest;
end;

그러나 장치 테스트를 원하는 방법이 데이터 모듈과 매우 밀접하게 수행하는 경우 개인 이외의 것이 안전하지 않은 것이 안전하지 않으면 단위가 필요한 코드를 분리하기 위해 메소드를 리팩토링하는 것을 고려해야합니다. 테스트 및 데이터 모듈의 내부에 액세스하는 코드.

다른 팁

약간 해킹되지만 이것이 가장 간단하고 명확한 접근법이라고 생각합니다. 이 조건부 편집 지침을 사용하십시오.

  {$IfNDef TEST}
  private
  {$EndIf}

단위 테스트 프로젝트는 테스트를 정의해야합니다 project → conditional defines. 가시성 사양이 없으면 게시됩니다.

주의 : 개인 가시성이 클래스 선언에서 첫 번째 가시성이 아닌 경우 이전 정의가 나타납니다. 더 안전하지만 더 장점적이고 명확하지 않은 방법은 다음과 같습니다.

  private
  {$IfDef TEST}
  public
  {$EndIf}

이것은 서브 클래스 또는 기타 접근법에 대한 많은 장점이 있습니다.

  • 추가 복잡성 없음 : 코드에 추가 클래스가 없습니다.
  • 아무도 "실수로"하위 클래스를 "실수로"수업을 무시할 수 없습니다 : 당신은 당신의 아키텍처를 보존합니다.
  • 당신이 방법이 보호되었다고 말하면, 당신은 그것이 그것을 무시할 것으로 기대합니다. 당신은 누가 당신의 코드를 읽고 있는지에 대해 이것을 말하고 있습니다. 재정의되지 않아야하는 보호 된 방법은 코드 리더를 혼동하여 첫 번째 프로그래밍 원칙을 깨뜨릴 수 있습니다. "코드는 다른 인간이 읽어야합니다."
  • Dunit은 자신의 단위에 있으며 어디에나 포함되어 있지 않습니다.
  • 당신은 지저분한 RTTI를 만지지 않습니다.

나는 그것이 더 명확한 솔루션이라고 생각하며, 선택된 답변보다 낫다고 생각합니다.

이것을 사용할 때, 나는 또한 빌드 객체를 기본 프로젝트의 다른 디렉토리에 넣도록 테스트 프로젝트를 구성합니다. 이것은 테스트 지침이있는 바이너리가 다른 코드와 혼합하도록 방지합니다.

나는 "추천" "xunit 테스트 패턴"Gerard Meszaros의 책 :

테스트 별 하위 클래스

의문: SUT의 개인 상태에 액세스해야 할 때 코드를 테스트 할 수있는 방법은 무엇입니까?

대답: 테스트에 필요한 상태 또는 행동을 SUT의 서브 클래스에 노출시키는 방법을 추가하십시오.

... 테스트중인 시스템 (SUT)이 특별히 테스트 할 수 있도록 설계되지 않은 경우 테스트가 테스트의 어느 시점에서 초기화하거나 확인해야한다는 상태에 액세스 할 수 없다는 것을 알 수 있습니다.

이 기사는 또한 언제 사용 해야하는지, 어떤 위험을 초래할 것인지 설명합니다.

Dunit 코드를 장치 내에 넣으십시오. 그런 다음 좋아하는 모든 것에 액세스 할 수 있습니다.

일반적으로,이 상황에 처할 때, 나는 종종 단일 책임 원칙을 위반한다는 것을 알고 있습니다. 물론 나는 당신의 구체적인 사건에 대해 아무것도 모르지만, 아마도 개인 방법은 그들 자신의 수업에 있어야합니다. 도대는 개인 섹션 에서이 새로운 클래스를 언급하는 것보다.

와 함께 확장 된 RTTI (Delphi 2010 및 Newer), RTTI를 통해 개인 방법을 호출하는 것도 또 다른 옵션입니다. 이 솔루션은 또한 최고급 답변입니다 개인 방법, 필드 또는 내부 클래스가있는 클래스를 어떻게 테스트합니까?

{$IFNDEF UNITEST}
private
{$ENDIF}

거의 해킹이 아닌 간단한 솔루션. 개인 방법을 테스트해야 하며이 기술은 가능한 한 적은 합병증을 더합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top