Pertanyaan khusus tentang pengujian unit Aplikasi Fabric Servis menggunakan Mocks

Dec 17 2020

Pertanyaan ini adalah tindak lanjut dari: Menulis UnitTests untuk Kelas Aplikasi Fabric Layanan

Definisi aplikasi saya adalah tipe - disederhanakan untuk menyelesaikan masalah paling dasar yang saya hadapi:

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);
            }
        }
    }
}

Dan kelas tesnya terlihat seperti:

namespace SearchService.Tests
{
    [TestClass]
    public class SearchServiceClassTest
    {
        [TestMethod]
        public void SearchServiceClassConstructor()
        {
           var searchServiceClass = new SearchServiceClass(MockStatelessServiceContextFactory.Default);
           Assert.IsTrue(searchServiceClass.IsDataJsonLoaded);
        }
    }
}

Pengecualian yang saya dapatkan adalah bahwa "System.NullReferenceException: Referensi objek tidak disetel ke turunan objek " . Yang muncul dari fakta bahwa "dataPackage.Path" tidak disetel ke nilai yang valid di "var dataPackage = Context .CodePackageActivationContext.GetDataPackageObject ("Data"); " garis.

Bagaimana cara mereplikasi CodePackageActivationContext menggunakan tiruan? "Data" di sini mengacu pada DataPackage yang merupakan folder dengan nama "Data" dan berada dengan kode untuk SearchServiceClass.

Jawaban

1 singhh-msft Dec 17 2020 at 17:31

Anda dapat menggunakan potongan kode di bawah ini untuk mengejek baris tersebut:

var codePackageActivationContext = new Mock<ICodePackageActivationContext>();

Untuk informasi lebih lanjut, lihat ini: Bagaimana cara menggunakan kerangka kerja Moq untuk menguji unit kain layanan biru?

Untuk kueri di bawah ini:

Beberapa hal lain yang tidak sepenuhnya saya mengerti, adalah variabel dan anggota yang dibuat di kelas, tetapi sebelum konstruktor dipanggil. Misalnya, "string pribadi jsonStr;" baris tampaknya dieksekusi tanpa masalah dalam Unit Test, meskipun saya hanya memanggil konstruktor dalam Unit Test, dan "private string jsonStr;" berada di luar konstruktor. Jadi, apakah hal yang sama akan berlaku untuk semua variabel yang dibuat di luar konstruktor?

Di sini, ini tentang kode C # sederhana: Sejalan private string jsonStr;, jsonStr didefinisikan. Tapi, sebelum mereferensikannya, Anda harus menginisialisasinya, jika tidak maka akan memunculkan error referensi null - yang Anda lakukan di konstruktor.