如何在Jasmine测试中重置knockout绑定

时间:2014-12-02 11:04:00

标签: knockout.js binding jasmine reset

我试图用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

1 个答案:

答案 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"));