2016-11-09 4 views
1

일부 비동기 작업 테스트에 Moq를 사용하려고합니다.C# moq 테스트 비동기 작업

모의 물건을 만들 수 있지만 mock.Object를 사용하려고하면 (Object = 'm.Object'가 'Castle.DynamicProxy.Generators.GeneratorException'예외를 던졌습니다.) VS가 멈 춥니 다. 디버그/실행. 여기

ID 테스트의 MOQ 방법 :

: 여기

interface ITestAsync 
     { 
      Task<IEnumerable<string>> get(); 
     } 

     [Fact] 
     public async Task MoqShouldReturnFIRST() 
     { 
      var m = new Mock<ITestAsync>(); 
      m.Setup(q => q.get()).ReturnsAsync(null); 

      var x = await m.Object.get().FirstIfNotNullOrEmptyAsync(); 

      x.Should().BeNull(); 
     } 

public class FirstIfNotNullOrEmptyAsyncTests 
    { 

     private async Task<IEnumerable<string>> getAll() 
     { 
      List<string> x = new List<string>(); 
      x.Add("01"); 
      x.Add("02"); 

      await Task.Delay(1000); 

      return x; 
     } 

     private async Task<IEnumerable<string>> getNull() 
     { 
      List<string> x = new List<string>(); 
      x = null; 

      await Task.Delay(1000); 

      return x; 
     } 

     private async Task<IEnumerable<string>> getEmpty() 
     { 
      List<string> x = new List<string>(); 

      await Task.Delay(1000); 

      return x; 
     } 

     [Fact] 
     public async Task ShouldReturnFIRST() 
     { 
      var x = await getAll().FirstIfNotNullOrEmptyAsync(); 

      x.Should().Be("01"); 
     } 

     [Fact] 
     public async Task ShouldReturnNULLforNULL() 
     { 
      var x = await getNull().FirstIfNotNullOrEmptyAsync(); 

      x.Should().BeNull(); 
     } 

     [Fact] 
     public async Task ShouldReturnNULLforEMPTY() 
     { 
      var x = await getEmpty().FirstIfNotNullOrEmptyAsync(); 

      x.Should().BeNull(); 
     } 
    } 
내가 시험에 노력하고

내 증축입니다 xUnit의

를 사용하여 전통적인 방법으로 테스트입니다
public static async Task<T> FirstIfNotNullOrEmptyAsync<T>(this Task<IEnumerable<T>> obj) where T : class 
     { 
      var result = await obj; 

      return (result != null && result.Any()) ? result?.FirstOrDefault() : null; 
     } 
+2

을 다시 만들어야 테스트를 통과. 초기 문제는 인터페이스가 비공개였습니다 (하지만 최소한의 예 때문에 추측). 인터페이스가 공개되면 모든 것이 작동/성공했습니다 – Nkosi

+0

전체 예외 메시지 포함 – Nkosi

답변

1

초기 문제는 인터페이스가 비공개 였지만 (최소한의 예 때문에 추측 됨)

다음과 같은 오류가있어

Castle.DynamicProxy.Generators.GeneratorException : 유형 에 대한 프록시를 생성 할 수 없습니다 Moq.IMocked`1 [[**** + ITestAsync, ***** , Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null]] 유형이 **** + ITestAsync가 아니기 때문에 에 액세스 할 수 없습니다. 어셈블리를 공개 또는 내부로 만들고 어셈블리 Moq의 강력한 이름이므로 [어셈블리 : InternalsVisibleTo (InternalsVisible.ToDynamicProxyGenAssembly2)] 특성으로 표시하십시오. 인터페이스는 공공, 모든것이 잘되었다되면

는/모든 모든 테스트를 통과 예에서

public interface ITestAsync { 
    Task<IEnumerable<string>> get(); 
} 
+0

그게 전부입니다! 일했다! 다른 질문. 코드 범위를 실행하면 이러한 확장 테스트의 모든 가능성을 테스트 할 때조차도 MoveNext() 부분의 테스트가 누락되어 90 % 만 적용됩니다. 모두 이미 테스트를 마쳤 으면 어떻게 테스트 할 수 있습니까? 없어진 물건 있어요? 건배. – 2Fast4YouBR

+0

그 주제에 대한 나의 현재 지식 기반 밖에 있습니다. 검색 후 커뮤니티에 도움을 요청하십시오. 해피 코딩 !!!! – Nkosi