为测试准备代码

Preparing code for testing

本文关键字:代码 测试      更新时间:2023-09-26

如果我有这样一个函数:

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中的默认调度器,从而使代码更易于测试。