【发布时间】:2020-08-10 08:06:30
【问题描述】:
这是我的组件:
@Component({
selector: 'app-signup',
templateUrl: './signup.component.html',
styleUrls: ['./signup.component.scss']
})
export class SignUpComponent implements OnInit {
specialLink: string;
constructor(
private activatedRoute: ActivatedRoute,
) {
this.specialLink = this.activatedRoute.snapshot.params.id;
console.log('TEST1', this.specialLink);
if (this.specialLink !== undefined) {
this.setSpecialSignup();
}
}
setSpecialSignup() {
console.log("CALLED;");
}
这是我的测试:
describe('SignUpComponent', () => {
let component: SignUpComponent;
let fixture: ComponentFixture<SignUpComponent>;
let ActivatedRouteMock: any;
beforeEach(async(() => {
ActivatedRouteMock = {
snapshot: {
params: { id: 123 }
},
};
TestBed.configureTestingModule({
declarations: [ SignUpComponent ],
imports: [ RouterTestingModule ],
providers: [
{provide: ActivatedRoute, useValue: ActivatedRouteMock}
]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(SignUpComponent);
component = fixture.componentInstance;
});
describe('Patient Side', () => {
it('should call setSpecialSignup() when user is coming from specialLink', () => {
spyOn(component, 'setSpecialSignup');
fixture.detectChanges();
expect(component.setSpecialSignup).toHaveBeenCalled();
});
我正在测试是否调用了 setSpecialSignup。它是! 2 'console.log' 证明了这一点。那么,为什么会出现这个错误:Expected spy setSpecialSignup to have been called.?
我错过了什么?
看来我需要能够更改 ActivatedRouteMock.snapshot.params.id 的值。有时它必须是未定义的,有时它必须是“某物”。我怎样才能做到这一点 ?我尝试了ActivatedRouteMock.snapshot.params.id = 'something',但它根本没有改变值,即使使用fixture.detectChanges()。我该怎么做?
【问题讨论】:
-
可能你的间谍太晚了。但是不要窥探你真正想要测试的东西——测试替身是为合作者准备的。
-
感谢您的回答。那我应该监视什么?
-
这取决于
setSpecialSignup实际上做了什么。 -
设置一些变量并从数据库(Firebase)获取数据
-
那么测试替身应该是它访问 Firebase 所通过的注入服务。
标签: angular unit-testing mocking karma-jasmine spy