2017-03-23 5 views
1

나는 AutoFixture, NSubstitute 및 xUnit으로 단위 테스트를하고 있습니다.NS substitute - 동일한 유형의 모든 인수에 대한 사양을 사용하십시오. TeamCity 문제

VS에서 로컬 dev 컴퓨터를 전달하지만 TeamCity에서 실패합니다.

테스트 :

 [Theory, AutoNSubstituteData] 
    public async void GetList_StatusError_ShouldReturnBadRequest(
     [Frozen] ICommentsService _commentsService, 
     [Frozen] IMerchantsService _merchantsService, 
     [Frozen] ICampaignsService _campaignsService) 
    { 
     // Arrange 

     var output = _fixture.Build<CommentsResult<CommentOutput>>() 
      .Without(w => w.Entity) 
      .With(x => x.Status, ServiceActionStatus.Error) 
      .Create(); 

     _commentsService.List(Arg.Any<int>(), Arg.Any<string>()).Returns(output); 

     var controller = new CommentController(_commentsService, _merchantsService, _campaignsService); 
     controller.Request = new HttpRequestMessage(); 
     controller.Configuration = new HttpConfiguration(); 

     // Act 
     IHttpActionResult actionResult = await controller.GetList(null); 
     var contentResult = actionResult as BadRequestErrorMessageResult; 

     // Assert 
     contentResult.Should().NotBeNull(); 
     contentResult.Message.Should().NotBeNullOrEmpty(); 
    } 

인 TeamCity 오류 :

public class CommentsResult<T> : IServiceResult<T> 
    { 
    public T Entity { get; set; } 
    public string Message { get; set; } 
    public Exception Exception { get; set; } 
    public ServiceActionStatus Status { get; set; } 
    } 

무엇을 할 수있다 :

NSubstitute.Exceptions.AmbiguousArgumentsException: 
    Cannot determine argument specifications to use. 
    Please use specifications for all arguments of the same type. at   NSubstitute.Core.Arguments.NonParamsArgumentSpecificationFactory.Create(Object argument, IParameterInfo parameterInfo, ISuppliedArgumentSpecifications suppliedArgumentSpecifications) 

모습 CommentsResult?

+0

다음은 [일반적인 문제를 진단하는 방법에 대한 정보]입니다 (http://stackoverflow.com/a/26856185/906). TC에서 테스트가 다른 순서로 실행 중이고 문제가 노출되고 있습니까? –

답변

0

일반적으로이 문제는 완전히 소모되지 않은 인수 사양으로 인해 발생합니다 (예 : Arg.Any<T>()을 비 가상 메소드로 전달). 잠재적 시나리오가 많이 있습니다. 특정 환경에서이를 볼 수있는 이유는 손상된 테스트와 동시성 (한 스레드의 쓰레기는 동일한 스레드에서 실행되는 것처럼 보이는 다른 테스트에서 소비됩니다)의 조합 일 수 있습니다. 여기에서 가장 큰 문제점은 많은 테스트가있는 경우 문제를 해결하는 것이 어려울 수 있다는 것입니다. 각각의 테스트에서 인수 사양이 누출 될 수 있기 때문입니다.

최근에이 문제를 해결하는 데 도움이되는 진단 도구 모음을 만들었습니다. "유출 된"인수 스펙을 찾을 수 있습니다. 테스트 실행을 크게 늦출 수 있으므로 나중에 비활성화해야합니다.

단계는 다음과 같습니다

  1. 복사 테스트와 프로젝트에 DiagnosticsSubstitutionContext.cs 파일.
  2. 모든 대기열에 포함 된 사양에 대한 정보가있는 사용자 지정 예외를 로깅하거나 다시 throw하여 appropriate place을 수정하십시오. 다음 번에 AmbiguousArgumentsException 예외가 발생하면이 트랩은 이전 테스트 실행에서 남은 사양 인 범인을 잡아야합니다. SpecCreationStack 필드 값은 정확한 장소를 찾는 데 도움이됩니다.
  3. 테스트 실행 전에 DiagnosticsSubstitutionContext 클래스의 정적 생성자를 트리거하도록 코드를 조정하십시오. 예를 들어, 다음과 같은 내용으로 AutoNSubstituteData 속성 클래스 내부의 정적 생성자를 만들 수 있습니다 : 예외가 다음 번에 발생합니다

    DiagnosticsSubstitutionContext.Init() 
    

후에는 깨진 사양에 대한 정보가 있어야합니다, 그래서 당신은 것입니다 정확한 장소를 찾으십시오.

P. 테스트를 실행하는 동안 파일을 .pdb 개로 유지하면 메소드 이름 외에도 깨진 스펙이 대기열에 들어간 정확한 코드 행을 볼 수 있어야합니다.