using Flyshot.Runtime.Common; using Flyshot.Runtime.Fanuc; using Flyshot.Runtime.Fanuc.Protocol; using Microsoft.Extensions.DependencyInjection; using System.Reflection; namespace Flyshot.Core.Tests; /// /// 验证 FANUC 运行时通过依赖注入解析时,能够稳定拿到日志依赖。 /// public sealed class FanucControllerRuntimeLoggingRegistrationTests { /// /// 验证宿主按 IControllerRuntime 解析 FANUC 运行时时,不会因为可选日志参数而退回到无日志实例。 /// [Fact] public void ServiceProvider_Resolves_FanucControllerRuntime_WithAllClientLoggers() { var services = new ServiceCollection(); services.AddLogging(); services.AddSingleton(); using var serviceProvider = services.BuildServiceProvider(); var runtime = serviceProvider.GetRequiredService(); var concreteRuntime = Assert.IsType(runtime); var loggerField = typeof(FanucControllerRuntime).GetField("_logger", BindingFlags.Instance | BindingFlags.NonPublic); Assert.NotNull(loggerField); Assert.NotNull(loggerField!.GetValue(concreteRuntime)); AssertClientLoggerIsInjected(concreteRuntime, "_commandClient"); AssertClientLoggerIsInjected(concreteRuntime, "_stateClient"); AssertClientLoggerIsInjected(concreteRuntime, "_j519Client"); } /// /// 断言运行时持有的底层协议客户端已注入对应类型的日志记录器。 /// /// 待检查的协议客户端类型。 /// 已经通过依赖注入解析出的 FANUC 运行时。 /// 运行时内部保存该客户端实例的字段名。 private static void AssertClientLoggerIsInjected(FanucControllerRuntime runtime, string clientFieldName) { var clientField = typeof(FanucControllerRuntime).GetField(clientFieldName, BindingFlags.Instance | BindingFlags.NonPublic); Assert.NotNull(clientField); var client = Assert.IsType(clientField!.GetValue(runtime)); var loggerField = typeof(TClient).GetField("_logger", BindingFlags.Instance | BindingFlags.NonPublic); Assert.NotNull(loggerField); Assert.NotNull(loggerField!.GetValue(client)); } }