Pertanyaan khusus tentang pengujian unit Aplikasi Fabric Servis menggunakan Mocks
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
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.