3

假设这是我的视图模型

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)
        }
    );

}

我想要一个测试来验证状态在设置 A 时在真假之间切换,但我无法超越 VM 的双重异步特性。有没有办法通过多个 stop()/start() 调用来测试它?

4

1 回答 1

5

如果您只测试什么之间的Status切换truefalse我只需订阅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。

于 2013-06-25T19:17:35.310 回答