【发布时间】:2020-06-01 10:56:32
【问题描述】:
运行测试时,我在测试中的模拟数据不会显示在标记中。无论我尝试什么(fakeasync、done、stubs),运行测试后,promise 的内容都不会呈现在标记中。
谁能告诉我为什么这个模拟的 promise 数据不会显示在 dom 中。我几乎花了 2 天时间,无论我尝试什么,它都无法正常工作。我正在使用 angular 8 并开始认为这是框架中的错误。
我有以下标记:
<div>
<div class="pt-8">
<!-- Displays -->
<ul>
<li *ngFor="let worker of workers">{{worker.getName()}}</li>
</ul>
<!-- DOES NOT DISPLAY -->
<ol>
<li *ngFor="let centre of centres">{{centre.name}}</li>
</ol>
</div>
</div>
这是课程:
import { Component, OnInit, Input, Inject } from '@angular/core';
import { WorkcentersService } from 'app/services/workcenters.service';
import { Workcenter } from 'app/model/workcenter';
import { User } from 'app/model/user';
@Component({
selector: 'test',
templateUrl: './test.component.html',
styleUrls: ['./test.component.scss']
})
export class TestComponent implements OnInit {
workers: User[];
centres: Workcenter[];
constructor(private workcentersService: WorkcentersService) { }
ngOnInit(): void {
let user1 = new User(); user1.name = "worker 1"; user1.surname = "surname1";
let user2 = new User(); user2.name = "worker 2"; user2.surname = "surname2";
let user3 = new User(); user3.name = "worker 3"; user3.surname = "surname3";
this.workers = [user1, user2, user3];
this.workcentersService.getWorkcentersList().then(wc => this.centres = wc);
}
}
这是测试:
import { ComponentFixture, TestBed, fakeAsync, tick } from '@angular/core/testing';
import { WorkcentersService } from 'app/services/workcenters.service';
import { Workcenter } from 'app/model/workcenter';
import { TestComponent } from './test.component';
fdescribe('TestComponent', () => {
let component: TestComponent;
let fixture: ComponentFixture<TestComponent>;
beforeEach(async () => {
const mockCentres = createMockCentres();
const mockWorkcentersService = jasmine.createSpyObj(["getWorkcentersList"]);
mockWorkcentersService.getWorkcentersList.and.returnValue(Promise.resolve(mockCentres));
TestBed.configureTestingModule({
declarations: [TestComponent],
imports: [],
providers: [
{ provide: WorkcentersService, useValue: mockWorkcentersService }
]
});
fixture = TestBed.createComponent(TestComponent);
component = fixture.componentInstance;
await fixture.whenStable();
fixture.detectChanges();
});
// Passes
it('should create', () => {
expect(component).toBeTruthy();
});
// Passes
it('should render users', async () => {
const displayedUsers = fixture.nativeElement.querySelectorAll("ul li");
expect(displayedUsers.length).toEqual(3);
});
// Fails
it('should render centres', async () => {
const displayedUsers = fixture.nativeElement.querySelectorAll("ol li");
expect(displayedUsers.length).toEqual(2);
});
// Fails
it('should display "hello"', fakeAsync(() => {
fixture.detectChanges();
tick();
const displayedUsers = fixture.nativeElement.querySelectorAll("ol li");
expect(displayedUsers.length).toEqual(2);
}));
function createMockCentres(): Workcenter[] {
const mockCentre1 = new Workcenter();mockCentre1.id = 1;mockCentre1.name = "Test centre 1";
const mockCentre2 = new Workcenter();mockCentre2.id = 2;mockCentre2.name = "Test centre 2";
return [mockCentre1, mockCentre2];
}
});
【问题讨论】:
-
您希望它出现在哪个测试用例中?你的测试用例失败了吗?
-
在测试“应该渲染中心”。但是它应该真正呈现在所有这些中。
-
将其中一个测试用例更改为适合,看看它是否呈现?
-
你是什么意思?它不会为其中任何一个渲染。
-
在下面试试我的解决方案。
标签: javascript angular testing jasmine karma-runner