为什么在测试用例中不会触发订阅代码?

时间:2015-11-29 03:15:39

标签: unit-testing automated-tests rxjs

我正在创建可用ID的简单检查器。用户在输入中输入ID,ajax请求检查可用性并通知用户。 js应用程序是有角度的,我使用requirejs将它们全部组合在一起并对karma + jasmine中的所有内容进行单元测试,并完全不知道如何测试它 - 我能够获得一些效果,但还不够。让我说我有checkUserId.js这样的(我尽可能简化)

define([
    'rxjs'
], function (Rx) {
    return function () {
        var $input = $('#userId'),
            $info = $('#info');

        var keyups = Rx.Observable.fromEvent($input, 'keyup')
            .pluck('target', 'value')
            .filter(function (value) {
                if (value.length !== 0) {
                   return value;
                }
            });

        //some code here with debounces, $.ajax, promises etc

        atLast.subscribe(function (value) {
            $info.html(value); //taken or free
        });
    }
});

所以checkUserIdSpec.js看起来像是:

define([
    'checkUserId',
    'rxjs'
], function (checkUserId, Rx) {
    var onNext = Rx.ReactiveTest.onNext,
        onCompleted = Rx.ReactiveTest.onCompleted,
        subscribe = Rx.ReactiveTest.subscribe;

    beforeEach(function () {
        $('body').append($('<input type="text" id="userId" value="">' +
                '<div id="info"></div>'));
        checkUserId();
    });

    describe('checkUserId', function () {
        it('some good name for this test', function () {

            var scheduler = new Rx.TestScheduler();

            var input = scheduler.createHotObservable(
                onNext(201, 's'),
                onNext(202, 'o'),
                onNext(203, 'm'),
                onNext(204, 'e'),
                onNext(205, 'n'),
                onNext(206, 'a'),
                onNext(207, 'm'),
                onNext(208, 'e'),
                onCompleted(300)
            );

            scheduler.startScheduler(function () {
                    return input.map(function (b) {
                        $('#userId').trigger('keyup');
                    });
                },
                {
                    created: 100,
                    subscribed: 150,
                    disposed: 400
                }
            );

            expect($('#container').html()).toEqual("free");
        });
    });
});

我希望能够获得具有反应性代码的包,将其放入测试用例并检查最终结果是否正常(那里没有很多逻辑,只需要嘲笑一些ajax,所以依赖在响应上将显示信息)。但没有任何东西超过第一个过滤器(我用控制台日志检查) - 当我在测试用例中触发keyup时,只执行checkUserId.js中的部分代码。即使我放了第二个过滤器,它也不会工作 - 它就像是唯一一个以某种方式对来自testcase的事件作出反应的是第一个(没有提到检查订阅函数会发生什么)。

长话短说 - 我只想将部分代码放入测试用例并知道我必须触发和提供什么才能执行整个路径?

请保持温柔 - 这是我第一次:)

0 个答案:

没有答案