QUnit Test - Knockout observableArray无法正确评估

时间:2013-04-26 14:29:04

标签: knockout.js qunit

我遇到一个奇怪的问题,这个测试失败了,没有明显的原因,我不知道发生了什么。有时我会刷新测试,它会通过。其他时候,如果不改变任何东西,它就会失败。想知道是否有人可以解释发生了什么。

以下是一些示例代码:

var viewModel = function() {
  return { TestDummy: ko.observable() };
};

QUnit.test("Test 1", function () {
    var curModel = new viewModel();
    validationTestCore.testMaxLength(curModel.TestDummy, '12345');

    QUnit.equal(curModel.TestDummy.errorMessages().length, 1); 
});

你可以看到curModel.TestDummy是一个可观察的。这个observable被传递给validationTestCore.testMaxLength,其中errorMessages observableArray被附加到它上面:

TestDummy.errorMessages = ko.observableArray();
TestDummy.errorMessages.push({ errorMessage: 'hello'});

当测试失败时,QUnit结果显示长度评估为0。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我不知道Knockout.js。

但是,这样的问题的一般原因是因为你的测试是非原子的。 先前测试的成功或失败正在影响其他人。

为了确保测试原子性,QUnit将sessionStorage存储在失败的测试中。在下一次运行中,它将首先执行失败的测试,然后执行剩余的测试。该方法提供不同的测试执行顺序。如果您的测试不是原子测试,则会失败。

更多了解jsfiddle

var truth = false;

test( "always fine test", function() {
  truth = !truth;
  ok( true, "Passed!" );
  console.log("always fine test");
});

test( "will toggle error test", function() {
  truth = !truth;
  ok( truth, "Passed!" );
  console.log("will toggle error test");
});

多次执行整个测试,会产生新的结果。

要避免这种行为,请按照出现的顺序执行测试。 您可以使用QUnit.config.reorder = false,但不建议这样做。