Playwright测试中调用ICompanyService出现空引用异常求助
问题分析与解决方案
空引用异常的核心原因是你的_companyService字段仅做了声明,从未被初始化赋值。Playwright的PageTest基类不会自动处理自定义服务的依赖注入,需要你手动完成服务实例的创建或注入。
解决方法1:直接实例化服务实现类(最简单的测试场景方案)
如果CompanyService是ICompanyService的具体实现类,可在测试初始化阶段直接实例化它,注意传入该类所需的依赖(比如数据库上下文等):
using System.Text.RegularExpressions; using System.Threading.Tasks; using Microsoft.Playwright.NUnit; using NUnit.Framework; using Stock.Collection.BussinessLogic.Services; using Stock.Collection.DataAccess.Entities; namespace PlaywrightTests; [Parallelizable(ParallelScope.Self)] [TestFixture] public class Tests : PageTest { private ICompanyService _companyService; // NUnit初始化方法,在每个测试执行前运行 [SetUp] public void Setup() { // 根据实际业务逻辑,传入CompanyService需要的依赖(比如DbContext实例) _companyService = new CompanyService(/* 此处填入你的依赖参数,例如new YourDbContext() */); } [Test] public async Task OpenPageAndGetList() { // ... 原有页面爬取逻辑 ... _companyService.StoreCompanyData(companiesList); } }
解决方法2:使用依赖注入容器(适配ASP.NET Core DI场景)
如果你的项目原本就使用ASP.NET Core依赖注入框架,可以在测试中构建服务容器并解析服务:
using Microsoft.Extensions.DependencyInjection; // ... 其他using语句 ... [Parallelizable(ParallelScope.Self)] [TestFixture] public class Tests : PageTest { private ICompanyService _companyService; [SetUp] public void Setup() { var services = new ServiceCollection(); // 注册你的业务服务和数据访问层依赖 services.AddScoped<ICompanyService, CompanyService>(); // 注册数据库上下文(示例) // services.AddDbContext<YourDbContext>(opt => opt.UseSqlServer("你的数据库连接字符串")); var serviceProvider = services.BuildServiceProvider(); _companyService = serviceProvider.GetRequiredService<ICompanyService>(); } // ... 测试方法 ... }
额外优化建议
- 变量名遵循C#规范:将循环内的
var Company = new Company();改为var company = new Company(); - 避免格式解析异常:
int.Parse和double.Parse容易因页面内容格式问题抛出异常,建议改用int.TryParse/double.TryParse做安全解析:if (j == 0) { if (int.TryParse(column, out var companyId)) { company.Id = companyId; } // 可选:添加断言或日志处理解析失败的情况 }
内容的提问来源于stack exchange,提问作者Tuan
相关产品推荐
相关产品推荐

