我试图用jasmine编写针对淘汰赛功能的测试,如下所示,我收到了以下错误:
错误:您无法多次将绑定应用于同一元素。
describe("ThreeStepNavigationView", ()=> {
var testSubject;
var SmallNavigationStates = ['ribbon','expanded'];
var ExtraSmallNavigationStates = ['collapsed','ribbon','expanded'];
beforeEach(()=> {
loadFixtures('SidebarAndSiteHeader.html');
testSubject = new Mobile.Navigation.ThreeStepNavigation.View();
ko.applyBindings(testSubject);
});
describe('When user clicks on navigation toggle button', ()=>{
it('Should update state class name to the next state', ()=>{
var button = $('#MobileMainNavLink');
var currentScreenSize = Mobile.Helpers.getScreenSize();
button.click();
var classValue = $("#sidebar-wrapper").attr('class');
if (currentScreenSize == 'ExtraSmall') {
expect(classValue).toBe(ExtraSmallNavigationStates[1]);
}
if (currentScreenSize == 'Small') {
expect(classValue).toBe(SmallNavigationStates[1]);
}
});
});
我确实尝试重置ko,但结果是一样的。
afterEach(()=>{
ko.cleanNode($('#MobileMainNavLink')[0]);
ko.cleanNode($('#sidebar-wrapper')[0]);
});
基于ko文档,cleanNode是一个内部函数,不属于API。
我使用的是ko 3.2和jasmine 1.5
答案 0 :(得分:0)
您未明确将绑定应用于节点。我相信这将适用于您的 document.body 。这解释了你的错误,因为你没有清洁身体。
ko.applyBindings(testSubject);
参考:http://knockoutjs.com/documentation/observables.html
如果您想知道ko.applyBindings的参数是什么,
第一个参数说明要使用的视图模型对象 它激活的声明性绑定
或者,您可以传递第二个参数来定义哪个部分 要搜索数据绑定属性的文档。例如, ko.applyBindings(myViewModel, 的document.getElementById(' someElementId&#39))。这限制了 激活ID为someElementId及其后代的元素, 如果您想拥有多个视图模型并关联,这非常有用 每个页面都有不同的区域。
有用功能:
// Checks if Element has Already been Bound (Stops Errors Occuring if already bound as element can't be bound multiple times)
var isBound = function (id) {
if (document.getElementById(id) != null)
return !!ko.dataFor(document.getElementById(id));
else
return false;
};
答案:
testSubject = new Mobile.Navigation.ThreeStepNavigation.View();
if (isBound("parent-container"))
ko.cleanNode(document.getElementById('parent-container'));
ko.applyBindings(testSubject, document.getElementById("parent-container"));