angular - 在同一服务中模拟一个函数以进行单元测试
问题描述
我在 Angular 6 中有此类服务:
export class AppService {
setValues(): Observable<any> {
const vm: any = this;
return new Observable(observer => {
vm.currentValues().subscribe(data => {
// continue modifying data and reset it
});
});
}
public currentValues(): Observable<any> {
return new Observable(observer => {
observer.next('data goes here')
});
}
}
currentValues() 是非常随机的,因此无法对其进行中继。如何在我的 unittest 文件中模拟它并在测试 setValues() 方法时使用它?
我已经尝试了以下方法,但我看不到如何使用它?
export function mockCurrentValues () : Observable<any> {
return of(
'data'
)
}
解决方案
假设AppService
是一个@Injectable()
并且您正在为提供者编写单元测试。你可以使用spys
提供的Jasmine Framework
https://jasmine.github.io/2.0/introduction.html#section-Spies
import { getTestBed, TestBed } from '@angular/core/testing';
import { AppService } from 'path/to/app/service';
import { of } from 'rxjs';
describe( 'App Service', function() {
let appService : AppService;
beforeEach( function() {
TestBed.configureTestingModule( {
providers: [ AppService ],
} );
const injector = getTestBed();
appService = injector.get( AppService );
spyOn( appService, 'currentValues' ).and.callFake( () => {
return of( 'data' );
} );
} );
describe( 'setValues', function() {
it( 'should set correct values', function() {
appService.setValues().subscribe();
// setValues will receive 'data' from the spy we just created while calling currentValues() method
// write your unit tests here
} );
} );
} );
推荐阅读
- firebase - 最大化 Firestore 中的文档存储空间
- java - 当没有定义请求对象时,如何使用 Spring Boot 发送 SOAP 请求
- clojure - 在 Clojure 中使用尼安德特人时出现 MKL 库错误
- python - 排序时嵌套的dict抛出关键错误
- c# - 如何在没有链接文本的情况下在 MVC C# 中使用 @Action 链接
- java - 如何让(轮盘赌)日程变慢
- mysql - 无法从 AWS Lambda 函数连接到在 AWS EC2 上运行的 MySQL 实例
- mysql - LOAD DATA LOCAL INFILE 操作一些日期列
- go - 如何使 goroutines 与匿名函数一起工作,在循环中返回值
- sql - 查询具有多个同名数组的表