2011-12-17 15 views
0

私はJasmineを使ってBackboneベースのアプリケーションをテストする方法を学びました。このため、私はここからいくつかのサンプルコードを手に入れました:http://msdn.microsoft.com/en-us/scriptjunkie/hh377172それを実行している間バックボーン - Jasmineを使った単純なモデルをTypeErrorでテストする

describe("Photo Model", function() { 
     it("verifies title", function() { 
     var myPhoto = new Photo(); 
     myPhoto.set({ title: "On the beach" }); 
     expect(myPhoto.get("title")) 
      .toEqual("On the beach"); 
     }); 
    }); 

、テストは以下のコードは、おそらく犯人ではTypeError

TypeError: Object [object Object] has no method 'apply' 
     at new <anonymous> (http://localhost:88/backbone/WebClient-Backbone2/js/backbone.js:1103:41) 
     at [object Object].<anonymous> (http://localhost:88/backbone/WebClient-Backbone2/test/spec.js:28:16) 
     at [object Object].execute (http://localhost:88/backbone/WebClient-Backbone2/test/lib/jasmine/jasmine.js:1001:15) 
     at [object Object].next_ (http://localhost:88/backbone/WebClient-Backbone2/test/lib/jasmine/jasmine.js:1790:31) 
     at [object Object].start (http://localhost:88/backbone/WebClient-Backbone2/test/lib/jasmine/jasmine.js:1743:8) 
     at [object Object].execute (http://localhost:88/backbone/WebClient-Backbone2/test/lib/jasmine/jasmine.js:2070:14) 
     at [object Object].next_ (http://localhost:88/backbone/WebClient-Backbone2/test/lib/jasmine/jasmine.js:1790:31) 
     at [object Object].start (http://localhost:88/backbone/WebClient-Backbone2/test/lib/jasmine/jasmine.js:1743:8) 
     at [object Object].execute (http://localhost:88/backbone/WebClient-Backbone2/test/lib/jasmine/jasmine.js:2215:14) 
     at [object Object].next_ (http://localhost:88/backbone/WebClient-Backbone2/test/lib/jasmine/jasmine.js:1790:31)  
+0

エラーがspec.js.のスローライン28であると思われますスペックファイル全体をここに投稿しましたか? –

+0

コード全体は上記のとおりです。 ** Photo **の定義とそれに続くスペック定義。したがって、28行目は '\t \tです。var myPhoto = new Photo();' – Karthik

+0

問題は、「new」が2回実行されたことが原因です。モデル定義から "new"を削除した後、問題の仕様が実行され、渡されました。 – Karthik

答えて

8

コメントに記載されているとおり、これはモデル定義の「新規」に起因することがわかりました。

だから、変更後、

var Photo = new Backbone.Model.extend({ 

var Photo = Backbone.Model.extend({ 

にエラーが姿を消しました。

1

で失敗し、次のように

Photo = new Backbone.Model.extend({ 
     defaults:{ 
      title: 'Another photo!', 
      tags: ['untagged'], 
      location: 'home', 
      src: 'placeholder.jpg' 
     }, 
     initialize: function(){ 
      console.log('this model has been initialized'); 
      this.bind("change:title", function(){ 
       var title = this.get("title"); 
       console.log("My title has been changed to.." + title); 
      }); 
     }, 

     setTitle: function(newTitle){ 
      this.set({ title: newTitle }); 
     } 
    }); 

はその後、テスト仕様を書きました。 Javascriptを、 の範囲の文脈では

this.bind("change:title", function(){ 
    var title = this.get("title"); 
    console.log("My title has been changed to.." + title); 
}); 

このは匿名関数(this.bind(「変更:タイトルを」内部にあるので、このキーワードは、それがである機能に基づいており、機能。 ())、その後、このは簡単な解決策は、匿名関数の外で別の変数にこのを設定するためにクロージャを使用することです。

をその範囲を変更しました、その後、あなたは匿名の内部で変数を使用することができます 関数。

コード例を見れば分かりやすくなるでしょう。 initializeメソッドを次のように更新します。

initialize: function(){ 
     console.log('this model has been initialized'); 
     var self = this; 
     this.bind("change:title", function(){ 
      var title = self.get("title"); 
      console.log("My title has been changed to.." + title); 
     }); 
    }, 

またのsetTitle()方法で同じ問題を抱えているだろう。 initialize()メソッドにこのコード行を追加して、というコンテキストを正しく設定する必要があります。

_.bindAll(this, "setTitle"); 
+0

意味があります。しかし、モデル定義から「新」を削除した後、問題は解決しませんでした。他の変更はありません! – Karthik

+0

今、スペックが再び失敗しなかったのはなぜだろうか?バックボーンは内部的に「this」を適切にバインドしていますか?私は今混乱している。 – Karthik

関連する問題