unit-testing - 如何使用 Qunit 对在可观察对象上使用节流的 Knockout View 模型进行单元测试

标签 unit-testing knockout.js qunit

假设这是我的 View 模型

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 时状态在 true 和 false 之间切换,但我无法通过 VM 的双重异步特性。有没有办法通过多次 stop()/start() 调用来测试它?

最佳答案

如果您只测试 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.

关于unit-testing - 如何使用 Qunit 对在可观察对象上使用节流的 Knockout View 模型进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17303722/

相关文章:

javascript - 等待 QUnit 测试

javascript - 你如何检查一个 JavaScript 对象是否是一个新的 DOM 元素?

unit-testing - AngularJS 中的单元测试 promise

javascript - 使用 sammy 设置 knockout 可观察值以进行路由

javascript - 使用 Qunit 对 javascript 函数进行单元测试

Javascript MVVM 设计模式 - 如何跟踪脏状态以及谁应该执行 Ajax?

knockout.js - Typescript 错误上下文 this

java - 在 IntelliJ IDEA 中执行单个 JUnit 测试用例失败

android - Android Instrumented 单元测试中的上下文和资源

c# - 最好的 Nunit 测试运行器是什么?