Mocks를 사용한 단위 테스트 Service Fabric 응용 프로그램에 대한 특정 질문

Dec 17 2020

이 질문은 다음에 대한 후속 조치 입니다. 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를 나타냅니다.

답변

1 singhh-msft Dec 17 2020 at 17:31

아래 코드를 사용하여 줄을 모의 할 수 있습니다.

var codePackageActivationContext = new Mock<ICodePackageActivationContext>();

자세한 내용 은 Moq 프레임 워크를 사용하여 Azure 서비스 패브릭을 단위 테스트하는 방법을 확인하세요 .

아래 쿼리 :

내가 완전히 이해하지 못하는 다른 것은 클래스에서 생성되는 변수와 멤버이지만 생성자가 호출되기 전에입니다. 예를 들어 "개인 문자열 jsonStr;" 단위 테스트에서 생성자를 호출하고 "개인 문자열 jsonStr"만 호출하더라도 라인이 단위 테스트에서 번거롭지 않게 실행되는 것 같습니다. 생성자 외부에 있습니다. 그러면 생성자 외부에서 생성 된 모든 변수에 동일하게 적용됩니까?

여기서는 간단한 C # 코드에 관한 것입니다. 라인 private string jsonStr;에 jsonStr이 정의되어 있습니다. 그러나 참조하기 전에 초기화해야합니다. 그렇지 않으면 생성자에서 수행하는 null 참조 오류가 발생합니다.