如何使用Qunit对使用可观察量上的节流的Knockout视图模型进行单元测试

时间:2013-06-25 17:27:56

标签: unit-testing knockout.js qunit

假设这是我的视图模型

function VM()
{
    var self = this;

    this.Status = ko.observable(false);

    this.A = ko.observable();

    this.B = ko.computed(
        function()
        {
            return self.A();
        }
    ).extend( throttle: 200 );

    this.B.subscribe(
        function()
        {
            self.Status(true);

            setTimeout( //ajax simulation
                function(){
                    self.Status(false);
                }

            ,200)
        }
    );

}

我想要一个测试来验证状态在true和false之间切换,因为A已设置但我无法通过VM的双异步性质。有没有办法用多个stop()/ start()调用来测试它?

1 个答案:

答案 0 :(得分:5)

如果您只测试Statustruefalse之间切换的内容,我只会订阅Status更改并检查更改回调我获得值true,第二次获得值false

以这种方式编写测试,你需要有一个启动/停止对,如下所示:

asyncTest("computed with ajax", function () {
    expect(2); // expecting two asserts, so the Status only changes twice
    var sut = new VM();
    // multiple calls to A to test the throttle behavior
    sut.A('something');
    sut.A('something2');
    sut.A('something3');
    stop();
    var callCount = 0;
    var expectedValues = [true, false];
    sut.Status.subscribe(function (value) {
        start();
        equal(sut.Status(), expectedValues[callCount]);
        callCount++;
    });
});

演示JSFiddle.