gpt4 book ai didi

javascript - 模拟 delay() RxJS 与 Jest

转载 作者:数据小太阳 更新时间:2023-10-29 05:27:44 26 4
gpt4 key购买 nike

例如,是否有简单的方法在一个带有假时间的可观察对象中模拟 RxJS 的 delay() 方法?

我有这个方法:

register(user) {
return this._checkLog(user).delay(500).flatMap( ... )
}

当我删除 delay() 方法时,我对 _register() 的测试全部成功。

最佳答案

RxJS v6

对于这样的 RxJS v6 代码:

代码.js

import { of } from 'rxjs';
import { delay } from 'rxjs/operators';

export const example = of('hello').pipe(
delay(1000)
);

...你可以使用sinon fake timers像这样:

import * as sinon from 'sinon';
import { example } from './code';

describe('delay', () => {
let clock;
beforeEach(() => { clock = sinon.useFakeTimers(); });
afterEach(() => { clock.restore(); });

it('should delay one second', () => {
const spy = jest.fn();
example.subscribe(spy);

expect(spy).not.toHaveBeenCalled(); // Success!
clock.tick(1000);
expect(spy).toHaveBeenCalledWith('hello'); // Success!
});
});

(请注意,在撰写本文时 Jest timer mocks 不起作用,不确定原因)


...或者你可以模拟 delay 不做这样的事情:

import { delay } from 'rxjs/operators';
import { example } from './code';

jest.mock('rxjs/operators', () => {
const operators = jest.requireActual('rxjs/operators');
operators.delay = jest.fn(() => (s) => s); // <= mock delay
return operators;
});

describe('delay', () => {
it('should delay one second', () => {
const spy = jest.fn();
example.subscribe(spy);

expect(delay).toHaveBeenCalledWith(1000); // Success!
expect(spy).toHaveBeenCalledWith('hello'); // Success!
});
});

RxJS v5

对于这样的 RxJS v5 代码:

代码.js

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/delay';

export const example = Observable.of('hello').delay(1000);

...你可以模拟 delay 不做这样的事情:

import { Observable } from 'rxjs/Observable';
import { example } from './code';

jest.mock('rxjs/add/operator/delay', () => {
const Observable = require('rxjs/Observable').Observable;
Observable.prototype.delay = jest.fn(function () { return this; }); // <= mock delay
});

describe('delay', () => {
it('should delay one second', () => {
const spy = jest.fn();
example.subscribe(spy);

expect(Observable.prototype.delay).toHaveBeenCalledWith(1000); // Success!
expect(spy).toHaveBeenCalledWith('hello'); // Success!
});
});

关于javascript - 模拟 delay() RxJS 与 Jest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55568855/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com