【发布时间】:2017-02-06 16:44:47
【问题描述】:
设置了我的测试套件,但不知道如何测试一个依赖 3rd 方模块从服务器获取文件名的 observable。
如何模拟 observable 以便测试我的 openConnection() 方法?我不想直接用间谍代替它,只需模拟 observable。
ssh.service.ts
openConnection(): Observable<any> {
this.Client = this.ssh.getClient();
return Observable.create((obs: Observer<string>) => {
let remotePathToList = '/home';
var conn = this.Client;
this.Client.on('ready', ()=>{
conn.sftp((err:any, sftp:any)=>{
if (err) throw err;
sftp.readdir(remotePathToList, (err:any, list:any)=>{
conn.end();
obs.next(list);
//obs.complete(); // required, otherwise your subscription would never close
})
})
}).connect(this.connSettings);
});
}
ssh.spec.ts
describe('SSH service', () => {
let subject: SshService;
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
SshService
]
});
});
beforeEach(inject([SshService], (sshService: SshService) => {
subject = sshService;
}));
it('should mock an observable', () => {
var res = Observable.create((obs: Observer<string>) => {
obs.next('hello');
});
expect(subject.openConnection()).toEqual(res);
});
});
【问题讨论】:
-
你想模拟一个 observable 还是测试它?让它像那样打开连接并不是很容易进行单元测试。
-
您是说您希望返回的 observable 等于
res,并且您正在尝试创建一个符合您期望的res? -
我知道让它打开一个连接也不是很单元测试,我只是想让所有组件工作然后我可以回去创建一个 getData() 方法可观察的调用。基本上我只是想弄清楚如何用一些虚拟数据在测试中解析我的 openConnection() 可观察对象,并测试 openConnection() 返回该虚拟数据。
标签: angularjs unit-testing rxjs angular2-observables