Files
DMS/PMSWPF.Tests/NotificationHelperTests.cs

99 lines
4.2 KiB
C#

using NLog;
using NLog.Config;
using NLog.Targets;
using NUnit.Framework;
using PMSWPF.Helper;
using System;
using System.Linq;
namespace PMSWPF.Tests
{
[TestFixture]
public class NotificationHelperTests
{
private MemoryTarget _memoryTarget;
// private Logger _logger; // 声明一个 Logger 变量 - 这个不再需要了
[SetUp]
public void Setup()
{
// 1. 加载外部的 nlog.config 文件
LogManager.LoadConfiguration("nlog.config");
// 2. 获取当前加载的配置
var config = LogManager.Configuration;
// 3. 创建 MemoryTarget
_memoryTarget = new MemoryTarget("testMemoryTarget")
{
// 捕获消息、级别、异常和 MDC 数据
Layout
= "${message}|${level}|${exception:format=tostring}|${mdlc:item=CallerFilePath}|${mdlc:item=CallerParentLineNumber}"
};
// 4. 将 MemoryTarget 添加到配置中
config.AddTarget(_memoryTarget);
// 5. 定义一个规则,将所有日志路由到 MemoryTarget
// 注意:这里我们添加一个新的规则,确保日志也发送到 MemoryTarget
config.AddRule(LogLevel.Trace, LogLevel.Fatal, _memoryTarget);
// 6. 重新应用配置,以包含新的 MemoryTarget 和规则
LogManager.Configuration = config;
// 7. 清空 MemoryTarget 中的日志
_memoryTarget.Logs.Clear();
}
[TearDown]
public void Teardown()
{
// 在每个测试结束后,重置 NLog 配置,避免影响其他测试
LogManager.Configuration = null;
// 清除 _memoryTarget 引用,以满足静态分析工具的建议
_memoryTarget.Dispose();
_memoryTarget = null;
}
[Test]
public void ShowException_ShouldLogErrorWithExceptionAndCallerInfo()
{
// Arrange
// var testMessage = "这是一个测试异常消息";
// var innerException = new InvalidOperationException("内部操作失败");
// var testException = new Exception("外部异常", innerException);
// var expectedCallerFilePath = "D:\\CShap\\PMSWPF\\Tests\\NotificationHelperTests.cs"; // 模拟调用文件路径
// var expectedCallerLineNumber = 49; // 模拟调用行号 (根据实际测试代码行数调整)
// Act
// 调用 ShowException 方法,并传入模拟的异常和调用信息
// NotificationHelper.ShowException(testMessage, testException, expectedCallerFilePath, expectedCallerLineNumber);
NlogHelper.Info("info");
NlogHelper.Warn("warn");
NlogHelper.Trace("trace");
NlogHelper.Error("hello");
// Assert
Assert.That(_memoryTarget.Logs.Count, Is.EqualTo(1), "应该只记录一条日志");
var logEntry = _memoryTarget.Logs[0];
// 验证日志消息
// Assert.That(logEntry, Does.Contain(testMessage), "日志消息应该包含测试消息");
//
// // 验证日志级别
// Assert.That(logEntry, Does.Contain("|Error|"), "日志级别应该是 Error");
//
// // 验证异常信息
// Assert.That(logEntry, Does.Contain(testException.Message), "日志应该包含外部异常消息");
// Assert.That(logEntry, Does.Contain(innerException.Message), "日志应该包含内部异常消息");
// Assert.That(logEntry, Does.Contain(nameof(InvalidOperationException)), "日志应该包含内部异常类型");
// Assert.That(logEntry, Does.Contain(nameof(Exception)), "日志应该包含外部异常类型");
//
// // 验证 CallerFilePath 和 CallerParentLineNumber
// Assert.That(logEntry, Does.Contain($"|{expectedCallerFilePath}|"), "日志应该包含 CallerFilePath");
// Assert.That(logEntry, Does.Contain($"|{expectedCallerLineNumber}"), "日志应该包含 CallerParentLineNumber");
}
}
}