델파이의 Dunitx와 함께 HTTP 요청에 대한 기대치 및 설정을위한 도서관.
* Webmocks는 Delphi 10.3 (RIO) 및 10.4 (Sydney)에서 개발되었으며 버전 3.0이 XE8과 호환 될 때까지 개발되었습니다. Webmocks는 xe8과 함께 소개 된 System.Net 라이브러리를 사용하므로 이전 버전과 호환되지 않습니다. 10.3 이전에 Delphi 버전에 설치 해야하는 경우 버전 2.0.0을 설치해야합니다.
Webmocks 3.2.0은 Delphi Getit 용 Embarcadero의 패키지 관리자를 통해 제공됩니다. getit을 포함하여 최근 버전의 델파이 버전이있는 경우 선호하는 설치 방법이어야합니다.
웹 모의는 이제 Delphinus Package Manager에 나열되어야합니다.
Delphinus를 통해 설치 한 후 Delphi를 다시 시작하십시오. 그렇지 않으면 테스트 프로젝트에서 장치를 찾을 수 없습니다.
Source 디렉토리를 "라이브러리 경로"및 "브라우징 경로"에 추가하십시오. Delphi 용 Webmocks에 대한 온화한 소개를 원한다면 Devi의 HTTP 클라이언트를 Dunitx 및 Webmocks로 테스트하는 데 시작하여 DEV에 게시 된 일련의 기사가 있습니다.
Delphi-Webmocks-Demos에는 기사와 함께 일련의 데모가 포함되어 있습니다.
버전 2가 Delphi. 모든 장치의 네임 스페이스. 모든 프로젝트는 버전 2 이상으로 업그레이드되면 Delphi. 포함 된 WebMocks 단위의 접두사.
테스트 장치 파일에는 몇 가지 간단한 단계가 필요합니다.
uses 에 WebMock 추가하십시오.TestFixture 클래스에서 Setup 및 TearDown 사용하여 TWebMock 인스턴스를 작성/파괴합니다. unit MyTestObjectTests;
interface
uses
DUnitX.TestFramework,
MyObjectUnit,
WebMock;
type
TMyObjectTests = class (TObject)
private
WebMock: TWebMock;
Subject: TMyObject;
public
[Setup]
procedure Setup ;
[TearDown]
procedure TearDown ;
[Test]
procedure TestGet ;
end ;
implementation
procedure TMyObjectTests.Setup ;
begin
WebMock := TWebMock.Create;
end ;
procedure TMyObjectTests.TearDown ;
begin
WebMock.Free;
end ;
procedure TMyObjectTests.TestGet ;
begin
// Arrange
// Stub the request
WebMock.StubRequest( ' GET ' , ' /endpoint ' );
// Create your subject and point it at the endpoint
Subject := TMyObject.Create;
Subject.EndpointURL := WebMock.URLFor( ' endpoint ' );
// Act
Subject.Get;
// Assert: check your subject behaved correctly
Assert.IsTrue(Subject.ReceivedResponse);
end ;
initialization
TDUnitX.RegisterTestFixture(TMyObjectTests);
end . 기본적으로 TWebMock 8080 에서 동적으로 할당 된 포트에 바인딩됩니다. 이 동작은 창조시 포트를 지정하여 무시할 수 있습니다.
WebMock := TWebMock.Create( 8088 ); 테스트 내에서 WebMock.URLFor 기능을 사용하는 것은 유효한 URL 구성을 단순화하는 것입니다. Port 속성에는 현재 바인딩 포트가 포함되어 있으며 BaseURL 속성에는 서버 루트에 유효한 URL이 포함되어 있습니다.
모든 요청 스텁에 대한 가장 간단한 요청 일치 및 시작점은 HTTP 방법 및 문서 경로입니다. 예를 들어 http 동사를 GET 하는 서버 / 로 가져 오십시오.
WebMock.StubRequest( ' GET ' , ' / ' ); 단일 와일드 카드 문자 * 를 사용하면 모든 요청에 맞는 데 사용할 수 있습니다. 예를 들어, 문서 경로에 관계없이 모든 POST 요청과 일치하려면 다음을 사용할 수 있습니다.
WebMock.StubRequest( ' POST ' , ' * ' );마찬가지로, 주어진 경로에 대한 모든 HTTP 방법과 일치하려면 다음을 사용할 수 있습니다.
WebMock.StubRequest( ' * ' , ' /path ' ); HTTP 방법과 문서 경로 모두에 대한 캐치- * 및 * 를 갖는 것이 완벽하게 가능합니다.
HTTP 요청 헤더는 다음과 같이 일치 할 수 있습니다.
WebMock.StubRequest( ' * ' , ' * ' ).WithHeader( ' Name ' , ' Value ' ); 다중 헤더 일치는 두 가지 방법으로 달성 할 수 있습니다. 첫 번째는 단순히 WithHeader 호출을 체인하는 것입니다.
WebMock.StubRequest( ' * ' , ' * ' )
.WithHeader( ' Header-1 ' , ' Value-1 ' )
.WithHeader( ' Header-2 ' , ' Value-2 ' ); 또는 WithHeaders 키 값 쌍의 TStringList 수락합니다.
var
Headers: TStringList;
begin
Headers := TStringList.Create;
Headers.Values[ ' Header-1 ' ] := ' Value-1 ' ;
Headers.Values[ ' Header-2 ' ] := ' Value-2 ' ;
WebMock.StubRequest( ' * ' , ' * ' ).WithHeaders(Headers);
end ;HTTP 요청은 다음과 같은 컨텐츠와 일치 할 수 있습니다.
WebMock.StubRequest( ' * ' , ' * ' ).WithBody( ' String content. ' ); HTTP 요청은 content-type 의 application/x-www-form-urlencoded 와 함께 제출 된 양식 데이터와 일치 할 수 있습니다. 다중 일치 필드 값을 결합 할 수 있습니다. 예를 들어:
WebMock.StubRequest( ' * ' , ' * ' )
.WithFormData( ' AField ' , ' A value. ' )
.WithFormData( ' AOtherField ' , ' Another value. ' ); 단순히 필드의 존재와 일치 시키려면 값을 위해 와일드 카드 * 전달할 수 있습니다.
참고 : Form-Data ( WithFormData ) 및 신체 내용 ( WithBody )을 동시에 일치시킬 수 없습니다. 두 가지를 지정하면 최신 통화가 이전 마칭자를 덮어 씁니다.
일반 표현에 의한 요청을 일치 시키면 리소스 이름과 /resource/999 와 같은 알려지지 않은 리소스 ID와 관련된 편안한 리소스의 동적 경로를 스터브하는 데 유용 할 수 있습니다. 이러한 요청은 다음과 같이 설명 할 수 있습니다.
WebMock.StubRequest( ' GET ' , TRegEx.Create( ' ^/resource/d+$ ' ));일치하는 헤더는 다음과 같이 달성 할 수 있습니다.
WebMock.StubRequest( ' * ' , ' * ' )
.WithHeader( ' Accept ' , TRegEx.Create( ' video/.+ ' ));일치하는 컨텐츠는 다음과 같이 수행 할 수 있습니다.
WebMock.StubRequest( ' * ' , ' * ' )
.WithBody(TRegEx.Create( ' Hello ' ));일치하는 양식 데이터 컨텐츠는 다음과 같이 수행 할 수 있습니다.
WebMock.StubRequest( ' * ' , ' * ' )
.WithFormData( ' AField ' , TRegEx.Create( ' .* ' )); 참고 : 사용 조항에 System.RegularExpressions 를 추가하십시오.
HTTP 요청은 WithJSON 사용하여 content-type 의 application/json 과 함께 제출 된 JSON 데이터와 일치 할 수 있습니다. 다중 일치 필드 값을 결합 할 수 있습니다. 예를 들어:
WebMock.StubRequest( ' * ' , ' * ' )
.WithJSON( ' ABoolean ' , True)
.WithJSON( ' AFloat ' , 0.123 )
.WithJSON( ' AInteger ' , 1 )
.WithJSON( ' AString ' , ' value ' ); 첫 번째 인수는 길이 될 수 있습니다. 예를 들어, 다음 JSON에서 경로 objects[0].key value 1 과 일치합니다.
{
"objects" : [
{ "key" : " value 1 " },
{ "key" : " value 2 " }
]
}참고 : 문자열 패턴은 두 번째 인수로 정규 표현을 전달하여 일치 할 수 있습니다. 예를 들어:
WebMock.StubRequest( ' * ' , ' * ' )
.WithJSON( ' objects[0].key ' , TRegEx.Create( ' valuesd+ ' ));HTTP 요청은 제출 된 XML 데이터 값과 일치 할 수 있습니다. 예를 들어:
WebMock.StubRequest( ' * ' , ' * ' )
.WithXML( ' /Object/Attr1 ' , ' Value 1 ' );첫 번째 인수는 XPath 표현입니다. 이전 예제는 다음 문서와 긍정적 인 일치를 할 것입니다.
<? xml version = " 1.0 " encoding = " UTF-8 " ?>
< Object >
< Attr1 >Value 1</ Attr1 >
</ Object >두 번째 인수는 부울, 부동 소수점, 정수 또는 문자열 값 일 수 있습니다.
일치하는 로직이 단순한 일치보다 더 복잡 해야하는 경우 테스트에서 술어 함수를 제공하여 요청을 일치시키기위한 사용자 정의 검사/논리를 허용 할 수 있습니다. 익명의 술어 함수는 요청을 검사하기 위해 IWebMockHTTPRequest 객체를받습니다. 술어 함수가 True 반환하면 스텁은 일치로 간주됩니다. False 반환하면 일치하지 않습니다.
술어 기능이있는 스터브 예 :
WebMock.StubRequest(
function(ARequest: IWebMockHTTPRequest): Boolean
begin
Result := True; // Return False to ignore request.
end
); 기본적으로 스터브 요청에 대한 응답 상태는 200 OK 입니다. 등록 된 스터브없이 TWebMock 에 요청이 이루어지면 501 Not Implemented . 응답 상태를 지정하려면 ToRespond 사용하십시오.
WebMock.StubRequest( ' GET ' , ' / ' ).ToRespond(TWebMockResponseStatus.NotFound);헤더는 다음과 같은 응답 스터브에 추가 할 수 있습니다.
WebMock.StubRequest( ' * ' , ' * ' )
.ToRespond.WithHeader( ' Header-1 ' , ' Value-1 ' ); 요청 헤더와 마찬가지로 메소드 체인링 또는 WithHeaders 메소드를 사용하여 여러 헤더를 지정할 수 있습니다.
WebMock.StubRequest( ' * ' , ' * ' ).ToRespond
.WithHeader( ' Header-1 ' , ' Value-1 ' )
.WithHeader( ' Header-2 ' , ' Value-2 ' );
/* or */
var
Headers: TStringList;
begin
Headers := TStringList.Create;
Headers.Values[ ' Header-1 ' ] := ' Value-1 ' ;
Headers.Values[ ' Header-2 ' ] := ' Value-2 ' ;
WebMock.StubRequest( ' * ' , ' * ' )
.ToRespond.WithHeaders(Headers);
end ; 기본적으로 Stubbed 응답은 컨텐츠 유형 text/plain 가진 제로 길이 본체를 반환합니다. string 로 쉽게 표시되는 간단한 응답 내용은 WithBody 와 함께 설정할 수 있습니다.
WebMock.StubRequest( ' GET ' , ' / ' )
.ToRespond.WithBody( ' Text To Return ' );특정 컨텐츠 유형을 반환하려면 두 번째 인수로 지정할 수 있습니다.
WebMock.StubRequest( ' GET ' , ' / ' )
.ToRespond.WithBody( ' { "status": "ok" } ' , ' application/json ' ); 이진 또는 큰 컨텐츠로 응답을 스터브 할 때는 컨텐츠를 파일로 제공하는 것이 더 쉽습니다. 이것은 WithBody 과 동일한 시그니처를 갖는 WithBodyFile 사용하여 달성 할 수 있지만 첫 번째 인수는 파일의 경로입니다.
WebMock.StubRequest( ' GET ' , ' / ' ).WithBodyFile( ' image.jpg ' ); Delphi-WebMocks는 파일 확장자에 따라 컨텐츠 유형을 설정하려고 시도합니다. 파일 유형을 알 수없는 경우 컨텐츠 유형은 application/octet-stream 으로 기본값을받습니다. 컨텐츠 유형은 두 번째 인수로 무시할 수 있습니다. 예를 들어
WebMock.StubRequest( ' GET ' , ' / ' ).WithBodyFile( ' file.myext ' , ' application/xml ' ); 참고 : 테스트에서 파일에 액세스하는 "Gotcha"는 파일의 위치가 기본적으로 Windows 32 비트 컴파일러를 사용하여 Win32Debug 폴더에 출력되는 테스트 실행 파일과 관련이 있다는 것입니다. 프로젝트 폴더에서 Content.txt 라는 파일을 올바르게 참조하려면 경로는 ....Content.txt 입니다.
때로는 요청에 동적으로 응답하는 것이 유용합니다. 예를 들어:
WebMock.StubRequest( ' * ' , ' * ' )
.ToRespondWith(
procedure ( const ARequest: IWebMockHTTPRequest;
const AResponse: IWebMockResponseBuilder)
begin
AReponse
.WithStatus( 202 )
.WithHeader( ' header-1 ' , ' a-value ' )
.WithBody( ' Some content... ' );
end
);이를 통해 요청에 대한 심층적 인 검사가 필요한 기능을 테스트하거나 응답에서 요청의 값을 반영 할 수 있습니다. 예를 들어:
WebMock.StubRequest( ' GET ' , ' /echo_header ' )
.ToRespondWith(
procedure ( const ARequest: IWebMockHTTPRequest;
const AResponse: IWebMockHTTPResponseBuilder)
begin
AResponse.WithHeader( ' my-header ' , ARequest.Headers.Values[ ' my-header ' ]);
end
);또한 성공을 거두기 전에 여러 시도에 대한 실패를 시뮬레이션하는 데 유용 할 수 있습니다. 예를 들어:
var LRequestCount := 0 ;
WebMock.StubRequest( ' GET ' , ' /busy_endpoint ' )
.ToRespondWith(
procedure ( const ARequest: IWebMockHTTPRequest;
const AResponse: IWebMockHTTPResponseBuilder)
begin
Inc(LRequestCount);
if LRequestCount < 3 then
AResponse.WithStatus( 408 , ' Request Timeout ' )
else
AResponse.WithStatus( 200 , ' OK ' );
end
); 현재 등록 된 스터브를 지우려면 ResetStubRegistry 에 전화하거나 TwebMock 인스턴스에서 Reset 할 수 있습니다. 일반적인 Reset 방법은 스터브 레지스트리를 비우는 것을 포함하여 TwebMock 인스턴스를 빈 상태로 반환합니다. 보다 구체적인 ResetStubRegistry 스터브 레지스트리 만 명확하게 제안됩니다.
Twebmock 인스턴스에 대한 모든 요청은 History 속성에 기록됩니다. 히스토리 항목에는 모든 주요 웹 요청 정보가 포함되어 있습니다. 메소드; requesturi; 헤더; 그리고 몸.
요청 기록에 따라 어설 션을 작성할 수 있습니다.
WebClient.Get(WebMock.URLFor( ' document ' ));
Assert.AreEqual( ' GET ' , WebMock.History.Last.Method);
Assert.AreEqual( ' /document ' , WebMock.History.Last.RequestURI);참고 : 이 매너에서 주장을 쓰는 것을 발견하면 이러한 주장을 정의하는보다 간결한 방법을 제공하는 요청 주장을 살펴 봐야합니다.
요청 내역을 지우야하는 경우 rebmock 인스턴스에서 ResetHistory 호출하거나 Reset 할 수 있습니다. 일반적인 Reset 방법은 TwebMock 인스턴스를 기록을 비우는 것을 포함하여 빈 상태로 반환합니다. 더 구체적인 ResetHistory 역사에만 명확하게 제안 된 바와 같이.
Dunitx Assertions를 사용하여 예상대로 동작 한 코드를 검증하는 것 외에도 요청 어시스트를 사용하여 요청이 예상대로 실행 된 곳에서 수행 할 것으로 예상되는지 확인할 수도 있습니다.
간단한 요청 어설 션 :
WebClient.Get(WebMock.URLFor( ' / ' ));
WebMock.Assert.Get( ' / ' ).WasRequested; // Passes 요청 스터브와 마찬가지로 HTTP 메소드, URI, 쿼리 매개 변수, 헤더 및 신체 내용 ( WithJSON 및 WithXML 포함)의 요청과 일치 할 수 있습니다.
WebMock.Assert
.Patch( ' /resource`)
.WithQueryParam( ' ParamName ' , ' Value ' )
.WithHeader( ' Content- Type ' , ' application/json ' )
.WithBody( ' { "resource": { "propertyA": "Value" } } ' )
.WasRequested; 긍정적으로 주장 할 수있는 모든 것 ( WasRequested )도 WasNotRequested 것으로 주장 될 수 있습니다. 이것은 코드가 추가로 원치 않는 요청을 수행하지 않는지 확인하는 데 유용합니다.
이 프로젝트는 시맨틱 버전을 따릅니다.
Copyright © 2019-2024 Richard Hatherall [email protected]
Webmocks는 Apache 라이센스 (버전 2.0)의 조건에 따라 배포됩니다.
자세한 내용은 라이센스를 참조하십시오.