2015-07-08 2 views
0

Если у меня есть функция, как это:Подготовка кода для тестирования

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. Но разве это не побеждает целую цель тестирования? В идеале мне не пришлось бы изменять оригинальный код, чтобы проверить его.

+2

Почему это нарушает цель тестирования? Вы должны тестировать логику, которая должна работать независимо от планировщика (запрет планировщиков, которые не могут планировать будущее). Вы можете просто добавить параметр, и если он равен null, 'bufferWithTime' будет использовать значение по умолчанию. – paulpdaniels

+1

Действительно, часть кода, подлежащего тестированию, заключается в написании кода, который не делает предположений. В этом случае ваш 'batchByTime' делает предположение о том, что Scheduler следует использовать при вызове' bufferWithTime'. Сделайте его пригодным для тестирования, удалив предположение и позвольте абонентам вводить планировщик, который они хотят использовать. – Brandon

+0

Действительно, сделать код более проверяемым, что имеет смысл. Благодаря! – GiantSquid

ответ

0

В качестве комментаторов к исходному вопросу, код должен быть более подвержен проверке путем параметризации его с помощью планировщика по умолчанию, используя блок-схему по умолчанию в bufferWithTime, если планировщик не предоставляется.

Смежные вопросы