准备测试代码
Preparing code for testing
如果我有这样的函数:
function batchByTime(obs) {
return obs.bufferWithTime(300).take(10);
}
我想这样测试它:
var onNext = Rx.ReactiveTest.onNext,
onCompleted = Rx.ReactiveTest.onCompleted,
subscribe = Rx.ReactiveTest.subscribe;
QUnit.test("hello test", function(assert) {
var scheduler = new Rx.TestScheduler();
var samplesObservable = scheduler.createHotObservable(
onNext(100, 1),
onNext(200, 2),
onNext(450, 3),
onNext(1000, 4),
onCompleted(1100)
);
var results = scheduler.
startWithTiming(function() {
return batchByTime(samplesObservable);
}, 0, 0, 1200);
var msgs = results.messages;
assert.equal(msgs[0].toString(), onNext(300, [1, 2]).toString());
assert.equal(msgs[0].toString(), onNext(600, [3]).toString());
assert.equal(msgs[0].toString(), onNext(900, [4]).toString());
});
我希望它能工作,但我却一次收到所有通知,收到:
Expected:
"OnNext(1,2)@300"
Result:
"OnNext(1,2,3,4)@1100"
对于每个断言。
我知道如果我将 TestScheduler scheduler
传递给 batchByTime
并将此调度程序用作 bufferWithTime
运算符中的参数,这将起作用。但这不是破坏了测试的全部目的吗?理想情况下,我不必修改原始代码来测试它。
正如原始问题的评论者指出的那样,如果没有提供调度程序,则应使用 bufferWithTime
中的默认调度程序,通过使用可能的调度程序对其进行参数化来使代码更易于测试。
如果我有这样的函数:
function batchByTime(obs) {
return obs.bufferWithTime(300).take(10);
}
我想这样测试它:
var onNext = Rx.ReactiveTest.onNext,
onCompleted = Rx.ReactiveTest.onCompleted,
subscribe = Rx.ReactiveTest.subscribe;
QUnit.test("hello test", function(assert) {
var scheduler = new Rx.TestScheduler();
var samplesObservable = scheduler.createHotObservable(
onNext(100, 1),
onNext(200, 2),
onNext(450, 3),
onNext(1000, 4),
onCompleted(1100)
);
var results = scheduler.
startWithTiming(function() {
return batchByTime(samplesObservable);
}, 0, 0, 1200);
var msgs = results.messages;
assert.equal(msgs[0].toString(), onNext(300, [1, 2]).toString());
assert.equal(msgs[0].toString(), onNext(600, [3]).toString());
assert.equal(msgs[0].toString(), onNext(900, [4]).toString());
});
我希望它能工作,但我却一次收到所有通知,收到:
Expected:
"OnNext(1,2)@300"
Result:
"OnNext(1,2,3,4)@1100"
对于每个断言。
我知道如果我将 TestScheduler scheduler
传递给 batchByTime
并将此调度程序用作 bufferWithTime
运算符中的参数,这将起作用。但这不是破坏了测试的全部目的吗?理想情况下,我不必修改原始代码来测试它。
正如原始问题的评论者指出的那样,如果没有提供调度程序,则应使用 bufferWithTime
中的默认调度程序,通过使用可能的调度程序对其进行参数化来使代码更易于测试。