1

파일을 제공하는 서비스를 테스트하는 방법이 서비스 엑셀은ServiceStack : 단위 나는 웹 서비스를

public class FileResult : IHasOptions, IStreamWriter, IDisposable 
{ 
    private readonly Stream _responseStream; 
    public IDictionary<string, string> Options { get; private set; } 

    public BinaryFileResult(byte[] data) 
    { 
     _responseStream = new MemoryStream(data); 

     Options = new Dictionary<string, string> 
     { 
      {"Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}, 
      {"Content-Disposition", "attachment; filename=\"InvoiceFile.xlsx\";"} 
     }; 
    } 

    public void WriteTo(Stream responseStream) 
    { 
     if (_responseStream == null) 
      return; 

     using (_responseStream) 
     { 
      _responseStream.WriteTo(responseStream); 
      responseStream.Flush(); 
     } 
    } 

    public void Dispose() 
    { 
     _responseStream.Close(); 
     _responseStream.Dispose(); 
    } 
} 

로 서비스에서 retured하고있는 객체를

public class ReportService : Service 
{ 
    public IReportRepository Repository {get; set;} 

    public object Get(GetInvoiceReport request) 
    { 
     var invoices = Repository.GetInvoices(); 

     ExcelReport report = new ExcelReport(); 
     byte[] bytes = report.Generate(invoices); 

     return new FileResult(bytes); 
    } 
} 

내가 설정 파일 이제 웹 서비스는 브라우저를 통해 테스트 할 때 잘 작동합니다. 단위 테스트에서 테스트 할 때 오류 메시지가 나타납니다.

System.Runtime.Serialization.SerializationException : PK \ u0003 \ u0004 : 유형 정의 은 '{', 기대 직렬화 된 형식 'FileResult이'로 시작하는 문자열을 가지고 시작해야 다음은 오류 메시지는 \ u0014 \ u0000 \ u0000 \ u0008 \ u0000 \ u000b5 \ u0000 \ u003 \ u0000 \ u0000 \ u003 \ u0000 \ u0000 \ u0000 [Content_Types] .xml at ServiceStack.Text.Common.DeserializeTypeRefJson.StringToType (TypeConfigtypeConfig, StringSegment strType, EmptyCtorDelegate ctorFn, 사전 2 typeAccessorMap) at ServiceStack.Text.Common.DeserializeType 1. <> c__DisplayClass2_0.b__1 (StringSegment ServiceStack.Text.Json.JsonReader 1.Parse(StringSegment value) at ServiceStack.Text.Json.JsonReader 1.Parse (문자열 값) ServiceStack.Text.JsonSerializer.DeserializeFromStream [T]에 ServiceStack.Text.JsonSerializer.DeserializeFromString [T] (문자열 값)에
(스트림에서의 값) ServiceStack.ServiceClientBase.Send [TResponse (httpMethod 문자열, 문자열 relativeOrAbsoluteUrl, 오브젝트 요청) 아래

에서 ServiceStack.ServiceClientBase.GetResponse [TResponse (WebResponse를 WebResponse를 )에서 스트림)은 단위 테스트입니다 나는 웹 서비스를 테스트하는 데 사용했다 :

[Test] 
public void TestInvoiceReport() 
{ 
    var client = new JsonServiceClient("http://localhost/report/"); 

    var authResponse = client.Send(new Authenticate 
       { 
        provider = CredentialsAuthProvider.Name, 
        UserName = "[User Name]", 
        Password = "[Password]" 
       }); 

    var requestDTO = new GetInvoiceReport(); 

    var ret = client.Get<FileResult>(requestDTO); 

    Assert.IsTrue(ret != null); 
} 

편집 : 나는 내 요청 DTO 클래스에 대한 정의를 포함하고 : 어떤 도움에 감사드립니다

[Route("/invoices", "GET")] 
public class GetInvoiceReport: IReturn<FileResult> 
{ 

} 

.

답변

2

참고 : 코드로 서비스를 호출하는 대신 HTTP 요청을하는 경우 단위 테스트 대신 Integration Test이됩니다.

에게 는

당신은 당신의 GetInvoiceReport 요청 DTO 정의를 제공하지 않은,하지만 당신은 직렬화 된 DTO를 아니에요 아무것도 반환하는 경우는, 그것의 IReturn<T> 인터페이스를 지정해야합니다 예 :

public class GetInvoiceReport : IReturn<byte[]> { ... } 

은 그럼 당신은있을거야

byte[] response = client.Get(new GetInvoiceReport()); 

HTTP 응답 헤더를 검사하는 데 서비스 클라이언트 요청 필터를 사용할 수 있습니다.

또한 downloading raw Responses에 대한 광범위한 정보가 포함 된 ServiceStack의 .NET 서비스 클라이언트 문서를 확인하는 것이 좋습니다.

+0

mythz : 내 요청 DTO에 대한 수업을 포함하도록 질문을 업데이트했습니다.BTW, 내 제안 DTO에 ": IReturn "을 추가하여 제안을 시도하고 "byte [] response = client.Get (new GetInvoiceReport());"를 사용했습니다. 내 단위 테스트에서 여전히 같은 오류 메시지가 나타납니다. –

+0

@ErmiasY 질문을 업데이트하여 사용중인 정확한 코드와 새 코드의 예외 코드를 표시하십시오. – mythz

+0

죄송합니다, 다른 브라우저 탭에서 편집하고 있습니다. 질문은 지금 완전히 업데이트되어야합니다. –