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

Dec 17 2020

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

1 singhh-msft Dec 17 2020 at 17:31

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.