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이라고 생각했지만이 경우는 아닙니다. 어째서 그 라인에서 끝나는 이유는 무엇입니까? 스왑 인스턴스 메소드를 사용하면 거기에 도착하지 않을 것이라고 추측되지만 스텁 클래스로 끝납니다. 스왑 인스턴스 구현에 문제가 있다고 생각합니다. 그러나이를 이해할 수는 없습니다.
이 테스트는 단위 테스트가 정확히 무엇인지 정확히 알 수는 없지만 프로그램의 출력과 입력을 테스트하는 가장 쉬운 방법입니다. 예를 들어, 유효하지 않은 파일이 해당 오류를 유발하는지 확인해야합니다. 쉽게 입력을 변경할 수 있다는 점이 훨씬 관리하기 쉬워졌습니다.