Khám phá những điều cơ bản để bắt đầu với FakeLogger
Ngày 5 tháng 10, 2025 · 2 phút đọc
Giới thiệu
Mocking các dependency trong quá trình phát triển đôi khi có thể là một thách thức, đặc biệt là khi bạn không sở hữu interface và các tương tác với interface trong code là các phương thức mở rộng. Đây chính xác là trường hợp của ILogger từ nền tảng logging cơ bản của Microsoft. Interface ILogger khá đơn giản, nhưng bạn hiếm khi tương tác trực tiếp với nó. Vậy làm thế nào để kiểm tra xem phương thức và tham số chính xác đã được gọi để đảm bảo logging của bạn đã chính xác?
Như tôi đã viết trước đây, bạn có thể mock ILogger<> bằng Moq và inject nó vào SUT (system under test), sau đó kiểm tra xem nó đã được gọi hay chưa. Tuy nhiên, điều này có thể trở nên phức tạp và bạn cũng cần sao chép mã kiểm tra mock giữa các dự án. Đây không phải là giải pháp lý tưởng.
Hãy chào đón FakeLogger!
FakeLogger cung cấp cho bạn quyền truy cập đầy đủ vào tất cả dữ liệu được gọi từ việc sử dụng ILogger trong code của bạn và cho phép bạn xác minh các giá trị trong unit tests của mình.
Bắt đầu
Nó đã được di chuyển xung quanh một chút kể từ khi bắt đầu, nhưng giờ đây bạn có thể tìm thấy nó trong gói Microsoft.Extensions.Diagnostics.Testing và nằm trong namespace Microsoft.Extensions.Logging.Testing như bạn mong đợi!
Sau khi tham chiếu package NuGet trong dự án test của bạn, bạn đã sẵn sàng bắt đầu sử dụng nó trong các unit tests của mình.
Sử dụng cơ bản
Để minh họa điều này, chúng ta cần một SUT mẫu để làm việc.
public class DemoService(ILogger<DemoService> logger)
{
public void LogMe()
{
logger.LogInformation("This should be logged.");
}
}
Trong service ở trên, chúng ta muốn kiểm tra rằng khi phương thức LogMe được thực thi, phương thức logging thích hợp đã được gọi.
Chúng ta bắt đầu bằng cách tạo một instance của SUT và điều này yêu cầu khởi tạo instance FakeLogger.
var fakeLogger = new FakeLogger<DemoService>();
var sut = new DemoService(fakeLogger);
Vì FakeLogger<> triển khai interface cần thiết, chúng ta có thể sử dụng một instance của nó để tạo DemoService của chúng ta.
Sau khi system đã được thực thi trong phần Act của test (như một phần của luồng kiểm tra AAA), chúng ta cần xác minh kết quả.
fakeLogger.LatestRecord.Message.Should().Be("This should be logged.");
Cách cơ bản nhất để thực hiện điều này là xem xét thuộc tính LatestRecord trên fake logger. Thuộc tính này hiển thị lần gọi cuối cùng tới instance logger trong system under test và đó là tất cả cho việc sử dụng cơ bản!
Kết luận
Trong bài viết này, chúng ta đã xem xét cách sử dụng FakeLogger khi kiểm tra system under test và yêu cầu một triển khai ILogger. Nó cho phép kiểm tra các mức độ logging chính xác, thông báo và dữ liệu có cấu trúc được chỉ định trong các thông báo logging của hệ thống của bạn.
Bạn vẫn đang tự triển khai mocking hay đã chuyển sang sử dụng FakeLogger?



