モックを使用したサービスファブリックアプリケーションの単体テストに関する具体的な質問

Dec 17 2020

この質問は、次のフォローアップです。サービスファブリックアプリケーションクラスのUnitTestの作成

私のアプリケーション定義はタイプです-私が直面している最も基本的な問題を解決するためにそれを単純化しました:

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」が「vardataPackage = Context」で有効な値に設定されていないために発生します。 .CodePackageActivationContext.GetDataPackageObject( "Data"); " ライン。

モックを使用してCodePackageActivationContextを複製するにはどうすればよいですか?ここでの「データ」とは、「データ」という名前のフォルダーであり、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参照エラーがスローされます。