2015-05-04 60 views
0

我試圖在角度js中創建一個「待辦事項列表」。完成任務後,我希望能夠點擊複選框標記完成。雖然它正在處理index.html,但我無法通過測試。無法獲得業力測試傳遞到控制器上

這是我的測試:

describe('ToDoListController', function() { 
    beforeEach(module('ToDoList')); 

    var ctrl; 

    beforeEach(inject(function($controller) { 
    ctrl = $controller('ToDoListController'); 
    })); 

    it('initialises with an empty list and term', function() { 
    expect(ctrl.listDisplay).toEqual([]); 
    expect(ctrl.taskTerm).toBeUndefined(); 
    }); 

    describe('when viewing the to do list', function(){ 

    it('displays list items', function() { 
     ctrl.taskTerm = "hello"; 
     ctrl.addTask(); 
     expect(ctrl.listDisplay[0].task).toBe("hello"); 
    }); 

    it('is completed when clicked', function() { 
     ctrl.taskTerm = "hello"; 
     ctrl.addTask(); 
     ctrl.isCompleted("hello"); 
     expect(ctrl.listDisplay[0].completed).toBe(true) 
    }); 

    }); 
}); 

,這是我的控制器:

toDoList.controller('ToDoListController', [function() { 

    var self = this; 
    self.listDisplay = [] 

    self.addTask = function() { 
    self.listDisplay.push({task: self.taskTerm, completed: false}) 
    }; 

    self.isCompleted = function(item) { 
    var i = self.listDisplay.indexOf(item) 
    self.listDisplay[i].completed = true 
    } 
}]); 

錯誤我得到的回覆是:

TypeError: Cannot set property 'completed' of undefined 
    at self.isCompleted (/Users/edobrien/Documents/Projects/todo_challenge/js/toDoListController.js:13:35) 
    at Object.<anonymous> (/Users/edobrien/Documents/Projects/todo_challenge/test/toDoListController.spec.js:26:12) 

僅供參考,錯誤發生在「ctrl.isCompleted(」hello「);」行

任何幫助你們可以給予將不勝感激!

回答

1

你的控制器的isCompleted方法是錯誤的:你的列表是對象的數組,沒有字符串:

self.addTask = function() { 
    self.listDisplay.push({task: self.taskTerm, completed: false}) 
}; 

如果設置taskTerm如「你好」,即推入數組的對象不是字符串「你好」,而是像

{task: "hello", completed: false} 

對象所以,當你嘗試的indexOf(「你好」),找到它,它總是會返回-1,因爲

"hello" != {task: "hello", completed: false}

更改您在數組中查找的對象的方式:

self.isCompleted = function(item) { 
    var completed=false; 
    self.listDisplay.forEach(function (value,index) { 
     if (value.task ==item) { 
      completed=value.completed; 
     } 
    }); 
    return completed; 
}; 

更新:我讀你的代碼時犯了一個錯誤:isCompleted是一個方法的名稱通常是檢查如果某事......好吧,如果有事情完成了。但實際上你的方法設置它完成。這種方法通常被命名爲setCompleted

所以方法應該是這樣的:

self.setCompleted = function(item) { 
    self.listDisplay.forEach(function (obj,index) { 
     if (obj.task ==item) { 
      obj.completed=true; //setting it as completed 
     } 
    }); 
}; 
+0

我現在越來越\t類型錯誤:無法讀取的未定義的屬性「的forEach」,是有什麼我失蹤? – Munded

+0

有一個錯字,我寫了ListDisplay而不是lisDisplay ...更新它......並且你不應該只是C&P代碼! ; P –

+0

哈哈對不起,我只是看看它是否有效! ListDisplay是正確的數組,我很困惑什麼你askign更正 – Munded

相關問題