.NET Core会话状态单元测试中如何使用Microsoft.Extensions.DependencyInjection
在测试中为Microsoft.AspNetCore.SystemWebAdapters使用Microsoft.Extensions.DependencyInjection
要在测试中引入依赖注入,核心是通过ServiceCollection构建DI容器,注册所需服务后从容器获取实例。以下是针对你的测试类的改造方案:
步骤1:添加必要的NuGet包
确保测试项目已安装Microsoft.Extensions.DependencyInjection包,用于构建DI容器。
步骤2:改造测试类
借助TestInitialize初始化DI容器并注册Mock依赖,TestCleanup清理容器避免资源泄漏,测试方法从容器获取实例而非手动创建:
[TestClass] public class HttpSessionStateTests { private readonly Fixture _fixture; private ServiceProvider _serviceProvider; private string _expectedSessionId; public HttpSessionStateTests() { _fixture = new Fixture(); } [TestInitialize] public void SetupDependencyInjection() { // 1. 创建服务集合 var services = new ServiceCollection(); // 2. 生成测试用SessionID并配置Mock _expectedSessionId = _fixture.Create<string>(); var mockSession = new Mock<ISessionState>(); mockSession.Setup(s => s.SessionID).Returns(_expectedSessionId); // 3. 将依赖注册到DI容器 services.AddSingleton(mockSession.Object); services.AddSingleton<HttpSessionState>(); // 4. 构建服务提供者 _serviceProvider = services.BuildServiceProvider(); } [TestCleanup] public void CleanupServiceProvider() { // 释放服务提供者,避免资源泄漏 _serviceProvider.Dispose(); } [TestMethod] public void SetupSessionID_WhenRetrieved_ShouldReturnTheSameSessionID() { // Arrange:从DI容器获取HttpSessionState实例 var state = _serviceProvider.GetRequiredService<HttpSessionState>(); // Act var result = state.SessionID; // Assert result.Should().Be(_expectedSessionId); } }
关键说明
- 隔离测试环境:
TestInitialize和TestCleanup确保每个测试拥有独立的DI容器,避免测试间状态污染。 - 模拟依赖注入:将Mock的
ISessionState注册为单例,让HttpSessionState在构造时自动获取该依赖,完全贴合真实项目的依赖注入逻辑。 - 资源管理:测试结束后释放
ServiceProvider,避免不必要的资源占用。
内容的提问来源于stack exchange,提问作者user1263981
相关产品推荐
相关产品推荐

