Javascript 为测试准备代码

Javascript 为测试准备代码,javascript,rxjs,Javascript,Rxjs,如果我有这样一个函数: 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

如果我有这样一个函数:

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());
});
我想这样测试它:

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
中的默认调度器,通过使用一个可能的调度器对代码进行参数化,从而使代码更易于测试。

为什么这会破坏测试的目的?您应该测试逻辑,不管调度程序是什么,逻辑都应该工作(排除无法执行未来调度的调度程序)。您只需添加参数,如果该参数为空,
bufferWithTime
将使用默认值。实际上,使代码可测试的一部分是编写不进行假设的代码。在本例中,您的
batchByTime
假设在调用
bufferWithTime
时要使用哪个调度程序。通过删除假设并允许调用方注入他们希望使用的调度程序,使其可测试。事实上,使代码更易于测试才是有意义的。谢谢