파일을 제공하는 서비스를 테스트하는 방법이 서비스 엑셀은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.JsonReader1.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>
{
}
.
mythz : 내 요청 DTO에 대한 수업을 포함하도록 질문을 업데이트했습니다.BTW, 내 제안 DTO에 ": IReturn"을 추가하여 제안을 시도하고 "byte [] response = client.Get (new GetInvoiceReport());"를 사용했습니다. 내 단위 테스트에서 여전히 같은 오류 메시지가 나타납니다. –
@ErmiasY 질문을 업데이트하여 사용중인 정확한 코드와 새 코드의 예외 코드를 표시하십시오. – mythz
죄송합니다, 다른 브라우저 탭에서 편집하고 있습니다. 질문은 지금 완전히 업데이트되어야합니다. –