Mocks를 사용한 단위 테스트 Service Fabric 응용 프로그램에 대한 특정 질문
이 질문은 다음에 대한 후속 조치 입니다. Service Fabric 애플리케이션 클래스에 대한 UnitTests 작성
내 응용 프로그램 정의는 유형입니다. 내가 직면 한 가장 기본적인 문제를 해결하기 위해 단순화했습니다.
namespace SearchService
{
internal sealed class SearchServiceClass : StatelessService
{
//variables defined followed by constructor
private string jsonStr;
public SearchServiceClass(StatelessServiceContext context)
: base(context)
{
try
{
var dataPackage = Context.CodePackageActivationContext
.GetDataPackageObject("Data");
jsonStr = File.ReadAllText(dataPackage.Path + @"\data.json");
}
catch
{
//exception handling code
throw;
}
}
public bool IsDataJsonLoaded
{
get
{
return !(jsonStr == null);
}
}
}
}
그리고 테스트 클래스는 다음과 같습니다.
namespace SearchService.Tests
{
[TestClass]
public class SearchServiceClassTest
{
[TestMethod]
public void SearchServiceClassConstructor()
{
var searchServiceClass = new SearchServiceClass(MockStatelessServiceContextFactory.Default);
Assert.IsTrue(searchServiceClass.IsDataJsonLoaded);
}
}
}
내가 얻는 예외는 "System.NullReferenceException : 개체 참조가 개체의 인스턴스로 설정되지 않았습니다. "라는 것입니다 . 이는 "dataPackage.Path"가 "var dataPackage = Context"에서 유효한 값으로 설정되지 않았기 때문에 발생 합니다. .CodePackageActivationContext.GetDataPackageObject ( "Data"); " 선.
mock을 사용하여 CodePackageActivationContext를 어떻게 복제합니까? 여기서 "데이터"는 "Data"라는 이름의 폴더이고 SearchServiceClass에 대한 코드와 함께 상주하는 DataPackage를 나타냅니다.
답변
아래 코드를 사용하여 줄을 모의 할 수 있습니다.
var codePackageActivationContext = new Mock<ICodePackageActivationContext>();
자세한 내용 은 Moq 프레임 워크를 사용하여 Azure 서비스 패브릭을 단위 테스트하는 방법을 확인하세요 .
아래 쿼리 :
내가 완전히 이해하지 못하는 다른 것은 클래스에서 생성되는 변수와 멤버이지만 생성자가 호출되기 전에입니다. 예를 들어 "개인 문자열 jsonStr;" 단위 테스트에서 생성자를 호출하고 "개인 문자열 jsonStr"만 호출하더라도 라인이 단위 테스트에서 번거롭지 않게 실행되는 것 같습니다. 생성자 외부에 있습니다. 그러면 생성자 외부에서 생성 된 모든 변수에 동일하게 적용됩니까?
여기서는 간단한 C # 코드에 관한 것입니다. 라인 private string jsonStr;
에 jsonStr이 정의되어 있습니다. 그러나 참조하기 전에 초기화해야합니다. 그렇지 않으면 생성자에서 수행하는 null 참조 오류가 발생합니다.