Если у меня есть функция, как это:Подготовка кода для тестирования
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
. Но разве это не побеждает целую цель тестирования? В идеале мне не пришлось бы изменять оригинальный код, чтобы проверить его.
Почему это нарушает цель тестирования? Вы должны тестировать логику, которая должна работать независимо от планировщика (запрет планировщиков, которые не могут планировать будущее). Вы можете просто добавить параметр, и если он равен null, 'bufferWithTime' будет использовать значение по умолчанию. – paulpdaniels
Действительно, часть кода, подлежащего тестированию, заключается в написании кода, который не делает предположений. В этом случае ваш 'batchByTime' делает предположение о том, что Scheduler следует использовать при вызове' bufferWithTime'. Сделайте его пригодным для тестирования, удалив предположение и позвольте абонентам вводить планировщик, который они хотят использовать. – Brandon
Действительно, сделать код более проверяемым, что имеет смысл. Благодаря! – GiantSquid