当前位置: 首页 > 知识库问答 >
问题:

测试时出现NullIn

通远
2023-03-14

我在Angular 12中运行ng测试时遇到以下问题:

NullInjectorError:R3Injector错误(DynamicTestModule)[BaseURL-

错误:未定义应为true。位于UserContext。(http://localhost:9876/karma_webpack/webpack:/src/app/menu/menu.component.spec.ts:46:23)ZoneDelegate。调用(http://localhost:9876/karma_webpack/webpack:/node_modules/zone.js/fesm2015/zone.js:372:1)位于ProxyZoneSpec。onInvoke(调用)(http://localhost:9876/karma_webpack/webpack:/node_modules/zone.js/fesm2015/zone-testing.js:287:1)

规格的代码是:

import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MenuComponent } from './menu.component';
import { DishService } from '../services/dish.service';

describe('MenuComponent', () => {
  let component: MenuComponent;
  let fixture: ComponentFixture<MenuComponent>;

const mockDishService = {
  getDishes: () => {
     return {
        id: '000',
        name: 'nnnnn'
     }
  }
}

  beforeEach(async () => {
    await TestBed.configureTestingModule({
      imports: [],
      declarations: [ MenuComponent ],
      providers: [
        { provide: DishService, useValue: mockDishService },
      ]
    })
    .compileComponents();
  });

  beforeEach(() => {
    fixture = TestBed.createComponent(MenuComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();

  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });

});

该组件的代码为:

import { Component, OnInit, Inject } from '@angular/core';
import { Dish } from '../shared/dish';
import { DishService } from '../services/dish.service';
import { flyInOut, expand } from '../animations/app.animation';

@Component({
  selector: 'app-menu',
  templateUrl: './menu.component.html',
  styleUrls: ['./menu.component.scss'],
  // tslint:disable-next-line:use-host-property-decorator
  host: {
    '[@flyInOut]': 'true',
    'style': 'display: block;'
    },
  animations: [
    flyInOut(),
    expand()
  ]
})
export class MenuComponent implements OnInit {

  dishes!: Dish[];
  errMess: string;
  
  constructor(private dishService: DishService, 
    @Inject ('BaseURL') public baseURL) { }

  ngOnInit(): void {
    this.dishService.getDishes().subscribe((dishes => this.dishes = dishes), errMess => this.errMess = <any>errMess);
  }

}

我使用baseURL来获取数据库的信息。运行json服务器时的json文件--观察数据库。json来模拟我从服务器获取信息,所以我有一个名为baseurl的共享.ts文件。ts具有以下代码:

export const baseURL = 'http://localhost:3000';

在app.module.ts中,我导入了常量

import { baseURL } from './shared/baseurl';

我将其添加为同一app.module中的提供者。ts文件

providers: [
    { provide: 'BaseURL', useValue: baseURL }
  ],

我将感谢有人在这个错误上的帮助

共有1个答案

全心思
2023-03-14

问题1:空注入器错误

此错误消息显示为您的DishComponent需要注入BaseURL [@Inject(“BaseURL”)]。

NullInjectorError:R3Injector错误(DynamicTestModule)[BaseURL-

问题 1 的解决方案

确保在单元测试的< code>providers部分中添加了< code>BaseURL。

const baseUrl = "your Base URL";

beforeEach(async () => {
  await TestBed.configureTestingModule({
    ...
    providers: [
      { provide: DishService, useValue: mockDishService },
      { provide: 'BaseURL', useValue: baseUrl },
    ]
  })
  .compileComponents();
});

问题 2:为 mockDishService.getDishes() 返回错误的值

MenuComponent 中,预计 dishService.getDishes() 返回 Observable 的值

dishes!: Dish[];

this.dishService.getDishes().subscribe((dishes => this.dishes = dishes), errMess => this.errMess = <any>errMess);

而< code > mockdishservice . get disks()返回< code>any或< code>Menu类型的值,返回的数据不匹配。

const mockDishService = {
  getDishes: () => {
    return {
      id: '000',
      name: 'nnnnn',
    };
  },
};

因此,您将收到如下错误消息:

TypeError:this.dishService.get菜(…)。订阅不是一个函数

问题2的解决方案:

确保< code > mockdishservice . get disks()返回< code>Observable的值

import { of } from 'rxjs';

const mockDishService = {
  getDishes: () => {
    return of([
      {
        id: '000',
        name: 'nnnnn',
      },
    ]);
  },
};

StackBlitz上的示例解决方案

 类似资料:
  • 当我尝试运行一个简单的JUnit 5测试(eclipse)时,我遇到了以下错误: 这是我的: 我尝试过类似问题的一些建议,比如这个github问题和其他问题,但是没有成功。我还在学习JUnit,所以我可能会忘记一些显而易见的东西。

  • 如果在测试时自动连接它工作得很好,但如果自动连接则会得到 这是的工作测试: 这是一个与仅有的区别: org.springframework.beans.factory.unsatisfieddependencyException:创建名为“it.euphoria.data.service.CustomerRepositoryTest”的bean时出错:通过字段“Customer Service”表

  • 问题内容: 我正在使用mocha-phantomjs设置进行单元测试。我有以下package.json脚本来运行测试。 在浏览器中可以正常运行。当我在cmd中运行命令时,测试运行正常,但同时也会出现以下错误 请任何人告诉我如何解决此错误。 问题答案: 当我在cmd中运行命令npm test时,测试运行正常 不,他们不是。您有6个失败的测试。的退出代码等于测试失败的次数。直接运行,看看有什么问题。意

  • 我试图测试一个基于Spring引导的Restendpoint。代码能够返回预期的输出,但测试失败,错误如下: 已解析[org.springframework.http.converter.HttpMessageNotWritableException:预设内容类型为“null”的[class java.util.LinkedList]没有转换器 对此有任何想法都将不胜感激! 下面是相同的代码: 控

  • 问题内容: 到目前为止,我有两个测试。一个仅使用jUnit框架即可正常工作。另一个使用spring-test库并在每次尝试运行该异常时创建此异常。有什么想法可能导致问题吗? Error Maven test dependencies Dependency tree 问题答案: 你是否正在使用旧版本的Eclipse(Galileo或更低版本)?还是旧版的junit插件?如果是这样,则可能是问题的原因

  • 原关闭原因未解决 这是我的测试类,它的方法使用NullPointer失败。 正如您所看到的,我甚至尝试在方法中正确初始化时钟,但仍然失败。当我启动应用程序时,它按预期工作。 这是时钟豆 这是个例外 java.lang.NullPointerException:时钟