1

ファイルを提供するサービスをテストするためにどのようにサービスExcelはServiceStack:ユニットIは、Webサービスを持っている

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); 
    } 
} 

と私のセットアップファイルさて、Webサービスはブラウザでテストしたときにうまく動作します。ユニットテストからテストすると、エラーメッセージが表示されます。以下はエラーメッセージです:で始まる 文字列を得た型定義 '{'、期待してシリアル化された形で始めるべき 'FileResult'::System.Runtime.Serialization.SerializationException

PK \ u0003 \ u0004 \\0000 \ u0008 \ 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.JsonSerializer.DeserializeFromStream [T](ストリームでServiceStack.Text.JsonSerializer.DeserializeFromStringでServiceStack.Text.Json.JsonReader 1.Parse(StringSegment value) at ServiceStack.Text.Json.JsonReader 1.Parse(String値)
[T](文字列 値)での値) ServiceStack.ServiceClientBase.Send [たTResponse](文字列HTTPMETHOD、 ストリングrelativeOrAbsoluteUrl、オブジェクト要求)未満

で ServiceStack.ServiceClientBase.GetResponse [たTResponse](にWebResponse にWebResponse)で ストリーム)は、ユニットテストであります

:私は、Webサービスをテストするために使用しました
[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の定義を提供していないが、あなたは、それは例えば、それにそのIReturn<T>インターフェースを指定する必要がありますシリアライズされたDTOはない何かを返している場合:

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

申し訳ありません、異なるブラウザのタブから編集していました。問題は完全に今更新する必要があります。 –

関連する問題