gpt4 book ai didi

javascript - 为什么 jasmine 无法比较 knockout.js 可观察对象,但可以使用正常函数?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:46:32 25 4
gpt4 key购买 nike

我今天正在编写 jasmine 测试,不得不模拟一个 knockout.js 对象结果,令我惊讶的是,尽管对象看起来相同,但它们并不相等。消除属性后,我将其缩小到 knockout.js observable。下面是两个测试,一个是失败的,一个是成功的。

(function() {

var describe = window.describe,
it = window.it,
expect = window.expect;

describe("Compare objects that have functions", function() {
function AddIsExpandedProperty(recordObject) {
recordObject.IsExpanded = ko.observable(false);
return recordObject;
}
it("object that has knockout function", function() { // this fails
var recordX = AddIsExpandedProperty({});
expect(recordX).toEqual(AddIsExpandedProperty({}));
});
it("object that has normal function", function() { // this succeeds
var func = function () { };
var recordY = { f: func };
expect(recordY).toEqual({ f: func });
});
});
})();

我想知道为什么? knockout.js 可观察对象不只是函数吗?

  1. 这个问题的一个解决方案是创建解包器,它将解包所有 knockout.js 可观察对象并生成解包对象。然后可以将它们与模拟的进行比较,但这不是真正的单元测试。
  2. 其他方法是使用 .toBeTruthy() 而不是 .toEqual() 但这又会危及测试 - 如果这些函数不同,测试就会通过。

有哪些不需要修改对象的解决方案?

我也试过很惨write jasmine test mock on plunker.

最佳答案

AddIsExpandedProperty 返回的两个对象不相等是很自然的。

ko.observable 函数本身会在您每次调用它时返回一个 function 实例。因此,您可以将 ko.observable 视为构造函数,这样在检查严格相等时,两个 ko.observable() 调用永远不会返回相同的对象。

所以你的反例不是测试 KO 的行为,一个更准确的例子是如果你的 func 返回一个新函数:

it("object that has normal function", function() {
var func = function () { return function() {} };
var recordY = { f: func() };
expect(recordY).toEqual({ f: func() });
});

当然这个测试用例也像 KO 一样失败了。

如果您想使用 ko.observable 属性测试对象相等性,那么我建议使用 ko.toJS 将您的 KO observable 转换为常规属性:

 it("object that has knockout function with toJS", function() {
var recordX = AddIsExpandedProperty({});
expect(ko.toJS(recordX)).toEqual(ko.toJS(AddIsExpandedProperty({})));
});

演示 Plnkr .

关于javascript - 为什么 jasmine 无法比较 knockout.js 可观察对象,但可以使用正常函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24404528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com