You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 19:50:25