我正在尝试使用Jasmine和Karma对组件进行单元测试。我正在使用Angular10。我要测试的组件是HomeComponent
。我对适合初学者的课程进行了测试
import { filter } from 'rxjs/operators';
import {setupCourses} from '../common/setup-test-data';
import {
async,
ComponentFixture,
TestBed,
} from '@angular/core/testing';
import { CoursesModule } from '../courses.module';
import { DebugElement } from '@angular/core';
import { HomeComponent } from './home.component';
import {
HttpClientTestingModule,
} from '@angular/common/http/testing';
import { CoursesService } from '../services/courses.service';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { of } from 'rxjs';
describe('HomeComponent', () => {
let fixture: ComponentFixture<HomeComponent>;
let component: HomeComponent;
let el: DebugElement;
let courseService: any;
const beginnerCourses = setupCourses().filter(course => course.category === 'BEGINNER');
beforeEach(async(() => {
const courseServiceSpy = jasmine.createSpyObj('CoursesService', [
'findAllCourses',
]);
TestBed.configureTestingModule({
imports: [CoursesModule, HttpClientTestingModule, NoopAnimationsModule],
providers: [{ provide: CoursesService, usevalue: courseServiceSpy }],
})
.compileComponents()
.then(() => {
fixture = TestBed.createComponent(HomeComponent);
component = fixture.componentInstance;
el = fixture.debugElement;
courseService = TestBed.inject(CoursesService);
});
}));
it('should create the component', () => {
expect(component).toBeTruthy();
});
it('should display only beginner courses', () => {
// pending();
courseService.findAllCourses.and.returnValue(of(beginnerCourses));
fixture.detectChanges();
});
我当然搜索了很多,但是找不到有用的东西。
我仍然收到此错误:
TypeError: Cannot read property 'returnValue' of undefined
at <Jasmine>
at UserContext.<anonymous> (http://localhost:9876/_karma_webpack_/src/app/courses/home/home.component.spec.ts:51:39)
at ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/node_modules/zone.js/dist/zone-evergreen.js:364:1)
at ProxyZoneSpec.push../node_modules/zone.js/dist/proxy.js.ProxyZoneSpec.onInvoke (http://localhost:9876/_karma_webpack_/node_modules/zone.js/dist/proxy.js:117:1)
at ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/node_modules/zone.js/dist/zone-evergreen.js:363:1)
at Zone.run (http://localhost:9876/_karma_webpack_/node_modules/zone.js/dist/zone-evergreen.js:123:1)
at runInTestZone (http://localhost:9876/_karma_webpack_/node_modules/zone.js/dist/jasmine-patch.js:176:1)
at UserContext.<anonymous> (http://localhost:9876/_karma_webpack_/node_modules/zone.js/dist/jasmine-patch.js:191:1)
at <Jasmine>
我不知道要更改什么? 谢谢。
答案 0 :(得分:0)
您必须在courseServiceSpy
块之外定义beforeEach
,以便其余代码可以访问该变量。
import { filter } from 'rxjs/operators';
import {setupCourses} from '../common/setup-test-data';
import {
async,
ComponentFixture,
TestBed,
} from '@angular/core/testing';
import { CoursesModule } from '../courses.module';
import { DebugElement } from '@angular/core';
import { HomeComponent } from './home.component';
import {
HttpClientTestingModule,
} from '@angular/common/http/testing';
import { CoursesService } from '../services/courses.service';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { of } from 'rxjs';
import SpyObj = jasmine.SpyObj;
describe('HomeComponent', () => {
let fixture: ComponentFixture<HomeComponent>;
let component: HomeComponent;
let el: DebugElement;
let courseServiceSpy: SpyObj<CoursesService>; // Declare the spy here
const beginnerCourses = setupCourses().filter(course => course.category === 'BEGINNER');
beforeEach(async(() => {
// Initialize the spy here
courseServiceSpy = jasmine.createSpyObj('CoursesService', [
'findAllCourses',
]);
TestBed.configureTestingModule({
imports: [CoursesModule, HttpClientTestingModule, NoopAnimationsModule],
providers: [{provide: CoursesService, usevalue: courseServiceSpy}],
})
.compileComponents()
.then(() => {
fixture = TestBed.createComponent(HomeComponent);
component = fixture.componentInstance;
el = fixture.debugElement;
});
}));
it('should create the component', () => {
expect(component).toBeTruthy();
});
it('should display only beginner courses', () => {
// pending();
// Mock the spy here
courseServiceSpy.findAllCourses.and.returnValue(of(beginnerCourses));
fixture.detectChanges();
});
});
在您先前的示例中,courseService
的定义仅在beforeEach
块内可见。 Read up here了解var
,let
和const
的范围。