Các câu hỏi cụ thể về các Ứng dụng Vải Dịch vụ kiểm tra đơn vị sử dụng Mocks
Câu hỏi này là phần tiếp theo của: Viết UnitTests cho một lớp ứng dụng Service Fabric
Định nghĩa ứng dụng của tôi thuộc loại - đơn giản hóa nó để giải quyết những vấn đề cơ bản nhất mà tôi đang gặp phải:
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);
}
}
}
}
Và lớp thử nghiệm trông giống như:
namespace SearchService.Tests
{
[TestClass]
public class SearchServiceClassTest
{
[TestMethod]
public void SearchServiceClassConstructor()
{
var searchServiceClass = new SearchServiceClass(MockStatelessServiceContextFactory.Default);
Assert.IsTrue(searchServiceClass.IsDataJsonLoaded);
}
}
}
Ngoại lệ tôi nhận được là "System.NullReferenceException: Tham chiếu đối tượng không được đặt thành một phiên bản của đối tượng " . Điều này phát sinh do "dataPackage.Path" không được đặt thành giá trị hợp lệ trong "var dataPackage = Context .CodePackageActivationContext.GetDataPackageObject ("Dữ liệu"); " hàng.
Làm cách nào để sao chép CodePackageActivationContext bằng cách sử dụng mô hình? "Dữ liệu" ở đây đề cập đến DataPackage là một thư mục có tên "Dữ liệu" và nằm cùng với mã cho SearchServiceClass.
Trả lời
Bạn có thể sử dụng đoạn mã dưới đây để mô phỏng dòng:
var codePackageActivationContext = new Mock<ICodePackageActivationContext>();
Để biết thêm thông tin, hãy xem phần này: Làm thế nào để sử dụng khung Moq để kiểm tra đơn vị vải dịch vụ màu xanh?
Đối với truy vấn dưới đây:
Một số điều khác mà tôi không hoàn toàn hiểu, là các biến và thành viên được tạo trong lớp, nhưng trước khi hàm tạo được gọi. Ví dụ: "private string jsonStr;" dòng dường như được thực thi mà không phiền phức trong Unit Test, mặc dù tôi chỉ gọi hàm tạo trong Unit Test và "private string jsonStr;" nằm ngoài hàm tạo. Vì vậy, điều tương tự sẽ áp dụng cho tất cả các biến được tạo bên ngoài hàm tạo?
Ở đây, nó là về một mã C # đơn giản: Trong dòng private string jsonStr;, jsonStr được định nghĩa. Tuy nhiên, trước khi tham chiếu nó, bạn nên khởi tạo nó, nếu không nó sẽ ném ra lỗi tham chiếu null - điều mà bạn đang thực hiện trong hàm tạo của mình.