gpt4 book ai didi

javascript - Jasmine 测试子类对象是否已通过 Knockout 订阅调用

转载 作者:行者123 更新时间:2023-11-30 18:14:59 26 4
gpt4 key购买 nike

我有一些东西在这里相互作用,但它们相互作用不好。

我有一个基类:

    var ObjOne = (function() {
return function() {
var self = this;
self.propertyOne = ko.observable(1);
self.observable = ko.observable(1);

self.observable.subscribe(function(newValue) {
self.propertyOne(newValue);
});
};
} ());

它有两个 Knockout observable,并在其中一个上定义了一个订阅来更新另一个。

我有一个“子类”,用 jQuery.extend 扩展:

    var ObjTwo = (function() {
return function() {
this.base = new ObjOne();
$.extend(this, this.base);
};
} ());

我有一个 Jasmine 测试,它试图询问“当我更新 observable 时,是否调用了 propertyOne?”

it('Test fails to call the correct propertyOne', function() {
var obj = new ObjTwo();
spyOn(obj, 'propertyOne').andCallThrough();

obj.observable(2);

expect(obj.propertyOne).toHaveBeenCalled();
expect(obj.propertyOne()).toBe(2);
});

这失败了,并显示“Expected spy propertyOne to have been called.”。当我调试时,observable 会正确更新。在实际系统中,它工作正常(同样,即使测试“propertyOne 等于 2?”也通过了。当我调试订阅函数时,self.propertyOne 不是 spy ,但在测试中,它是。

我有一个解决方案,但不是很好:

 it('Test calls the base propertyOne', function() {
var obj = new ObjTwo();
spyOn(obj.base, 'propertyOne').andCallThrough();

obj.observable(2);

expect(obj.base.propertyOne).toHaveBeenCalled();
expect(obj.propertyOne()).toBe(2);
});

注意添加到这两行的.base。我不喜欢我必须公开基类,或者必须接触它的属性才能使测试运行。

这是一个 jsfiddle:http://jsfiddle.net/4DrrW/23/ .问题是 - 有更好的方法吗?

最佳答案

在调用 $.extend(this, this.base); 之后,您的对象基本上如下所示:

{
base: {
propertyOne: ko.observable(1),
observable: ko.observable(1)
},
propertyOne: base.propertyOne,
observable: base.observable
}

当您为 propertyOne 执行 spyOn 时,它会将其替换为包装器。然而,订阅是在实际的可观察对象之间设置的,并且没有任何方法可以调用包装器。

如果您不想访问 base,那么我将删除调用 observable 的测试。检查该值是否正确似乎就足够了。

否则,您可能最好通过使用新对象的 this 调用其构造函数来混合 ObjOne,例如:

var ObjTwo = (function() {
return function() {
ObjOne.call(this);
};
} ());

然后,测试就可以了:http://jsfiddle.net/rniemeyer/z2GU3/

关于javascript - Jasmine 测试子类对象是否已通过 Knockout 订阅调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13520033/

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