2012-12-24 3 views
1

IDataReader.LoadAsync 메서드를 사용하는 Windows Store 클래스 라이브러리 프로젝트의 단위 테스트를 시도하고 있습니다. LoadAsync 메서드의 반환 형식 인 DataReaderLoadOperation을 제외하고 필요한 IDataReader의 모든 부분을 구현하는 자체 스텁을 만들 수 있습니다. 이것은 공용 생성자가없는 봉인 된 클래스이므로 스텁의 LoadAsync 메서드에서 반환 할 내용을 알지 못합니다.Windows 용 스토어 단위 테스트 프로젝트

내가 테스트중인 코드는 await을 제외하고는 LoadAsync 결과를 사용하지 않으므로 내 스텁에서 null을 반환하려고했습니다. 그러나 프레임 워크가 null DataReaderLoadOperation (즉, IAsyncOperation 인 <uint>)을 Task로 변환하고 NullReferenceException을 트리거하려고하기 때문에 AggregateException이 발생합니다.

스토어 유닛 테스트 프로젝트에는 Microsoft Fakes를 사용할 수없고 일반 유닛 테스트 프로젝트에만 사용할 수 있으므로 도움이되지 않습니다.

Windows Store 단위 테스트 프로젝트에서 DataReader.LoadAsync를 모의 처리하려면 어떻게해야합니까?


EDIT : Per Stephen의 대답에 따라 IInputStream을 조롱했습니다. 아래는 참고 자료입니다.

internal class InputStreamStub : IInputStream 
{ 
    public IAsyncOperationWithProgress<IBuffer, uint> ReadAsync(IBuffer buffer, uint count, InputStreamOptions options) 
    { 
     return 
      AsyncInfo.Run<IBuffer, uint> 
      (
       (token, progress) => 
        Task.Run<IBuffer> 
        (
         () => 
         { 
          progress.Report(0); 
          token.ThrowIfCancellationRequested(); 
          var source = Encoding.UTF8.GetBytes(reads.Dequeue()); 
          Assert.IsTrue(buffer.Capacity > source.Length); // For the purposes of the unit test, the buffer is always big enough 
          if (source.Length > 0) // CopyTo throws an exception for an empty source 
           source.CopyTo(buffer); 
          buffer.Length = (uint) source.Length; 
          progress.Report(100); 
          return buffer; 
         }, 
         token 
        ) 
      ); 
    } 

    public void Dispose() 
    { 
    } 

    private Queue<string> reads = new Queue<string>(new[] 
    { 
     "Line1\r\nLine", 
     "2\r\nLine3\r", 
     "\nLine4", 
     "", 
     "\r\n", 
     "Line5", 
     "\r\n", 
     "Line6\r\nLine7\r\nLine8\r\nL", 
     "ine9\r", 
     "\n" 
    }); 
} 

답변

2

기본 스트림을 조롱하고 조롱 한 스트림에서 일반 DataReader을 사용하는 것이 좋습니다.

0

데이터 판독기를 어댑터와 함께 포장하여 단위 테스트를 작성할 수 있습니까?

+0

아니요, 작동하지 않습니다. DataReader.LoadAsync의 반환 값은 DataReaderLoadOperation 개체 여야합니다. – Arnavion

+0

더 나은 답변 제안 :-) –