2015-01-12 11 views
0

Typemock을 사용하여 일부 단위 테스트를하고 있습니다. 필자의 경우 Im은 flat file dataprocessing을 수행하는 프로그램을 테스트합니다. 이 프로그램을 단위 테스트하기 위해 필자는 실제 버전이 사용하는 것과 동일한 인터페이스를 구현하는 몇 개의 스텁 클래스를 작성했지만 파일 시스템에 쓰는 대신 내부 문자열을 포함합니다.Typemock : 인터페이스에서 스텁으로 클래스를 바꿀 때 오류가 발생했습니다.

이제 Typemock이 클래스의 실제 버전을 테스트에서 스텁 변수로 바꾸려고 시도하고 있지만 다음 오류가 발생합니다. System.InvalidOperationException : Nullable 개체에 값이 있어야합니다.

이것은 내 스텁으로 대체하기 위해 노력하고있어 실제 버전입니다 (자세한 내용을 포함하지만, 오류가 그 라인에없는) :

public class BatchRepository : IBatchRepository 
    { 
     private readonly string _connectionStringName; 

     public BatchRepository(string connectionStringName) <-- Error triggers on this line 
     { 
      _connectionStringName = connectionStringName; 
     } 
} 

스텁 클래스 :

public class BatchRepositoryStub : IBatchRepository 
{ 
    private readonly string _connectionStringName; 

    public BatchRepositoryStub(string connectionStringName) 
    { 
     _connectionStringName = connectionStringName; 
    } 
} 

테스트 클래스 내 testmethod :

[TestClass] 
public class InputTest 
{ 
    // Variables 
    private IBatchRepository _batchRepository; 
    private ICommunicatieproductRepository _communicatieproductRepository; 

    // Constants 
    private const string ConnectionStringName = "Test"; 
    private const string InputFileLocation = "Temp"; 
    private const string ArchiefLocation = "Temp"; 
    private const string ErrorLocation = "Temp"; 
    private const string LoggingLocation = "Temp"; 
    private const int BatchGrootte = 1000; 

    // Use TestInitialize to run code before running each test 
    [TestInitialize()] 
    public void Initialize() 
    { 
     _batchRepository = new BatchRepositoryStub(ConnectionStringName); 
     _communicatieproductRepository = new CommunicatieproductRepositoryStub(ConnectionStringName); 

    } 

    [TestMethod] 
    public void CMBatch_FDInput_NewFileErrorOnEmptyRelatienummer() 
    { 
     // Arrange 
     Isolate.Swap.NextInstance<IBatchRepository>().With(_batchRepository); 
     Isolate.Swap.NextInstance<ICommunicatieproductRepository>().With(_communicatieproductRepository); 

     var inputFileProcessor = new InputFileProcessor(InputFileLocation, ArchiefLocation, ErrorLocation, LoggingLocation, BatchGrootte, ConnectionStringName); 
     } 

}

실제 공정은,이

public class InputFileProcessor 
    { 
     private readonly string _inputFileLocation; 
     private readonly string _archiefLocation; 
     private readonly string _errorLocation; 
     private readonly string _loggingLocation; 
     private readonly int _batchGrootte; 
     private readonly IBatchRepository _batchRepository; 
     private readonly ICommunicatieproductRepository _communicatieproductRepository; 

     /// <summary> 
     /// Constructor 
     /// </summary> 
     public InputFileProcessor(string inputFileLocation, string archiefLocation, string errorLocation, string loggingLocation, int batchGrootte, string connectionStringName) 
     { 
      _inputFileLocation = inputFileLocation; 
      _archiefLocation = archiefLocation; 
      _errorLocation = errorLocation; 
      _loggingLocation = loggingLocation; 
      _batchGrootte = batchGrootte; 
      _batchRepository = new BatchRepository(connectionStringName); 
      _communicatieproductRepository = new CommunicatieproductRepository(connectionStringName);   
     } 
} 

오류 InputFileProcessor 생성자 호출 BatchRepository 생성자, 트리거 오류를 트리거한다. 처음에는 매개 변수 connectionstringname이 null이라고 생각했지만이 경우는 아닙니다. 어째서 그 라인에서 끝나는 이유는 무엇입니까? 스왑 인스턴스 메소드를 사용하면 거기에 도착하지 않을 것이라고 추측되지만 스텁 클래스로 끝납니다. 스왑 인스턴스 구현에 문제가 있다고 생각합니다. 그러나이를 이해할 수는 없습니다.

이 테스트는 단위 테스트가 정확히 무엇인지 정확히 알 수는 없지만 프로그램의 출력과 입력을 테스트하는 가장 쉬운 방법입니다. 예를 들어, 유효하지 않은 파일이 해당 오류를 유발하는지 확인해야합니다. 쉽게 입력을 변경할 수 있다는 점이 훨씬 관리하기 쉬워졌습니다.

답변

0

분명히 이것은 Typemock에서 수행 할 수없는 작업입니다. 그것은 본질적으로 코드의 너무 큰 덩어리를 테스트하는 것입니다. 정확히 단위 테스트가 아닙니다. 현재이 회사에서 내부적으로 사용되는 변형을 사용하여 코드를 리팩토링했습니다.

1

는 물론이 (이러한 할당 할 필요가 없습니다) 스텁 호출을 전달

사용 Swap.CallsOn(object) :-) Typemock 수행 할 수 있습니다. 버전 8에서

// grab future 
var futureInstanceHandle = Isolate.Fake.NextInstance<BatchRepository>(); 
// swap (ingoring type hiearchy) 
Isolate.Swap.CallsOn(futureInstanceHandle).WithCallsTo(_batchRepositorystub); 

, 당신은 인터페이스에 대한 Fake.NextInstance<IBatchRepository>를 사용할 수 있습니다

예를 참조! 이것은 IBatchRepository을 구현 한 첫 번째 인스턴스를 잡아낼 것입니다.

p.s Typemock에서 일합니다.