2011-08-16 21 views
7

मैं निम्नलिखित कोड है:JsTestDriver के साथ AngularJS नियंत्रक का परीक्षण कैसे करें?

function TestStats($xhr) { 
    $xhr(
      'GET', 
      '/test-dashboard/get-projects.json', 
      angular.bind(this, function(code, response) { 
       this.projects = response.projects; 
       this.projects.splice(0, 0, undefined); 
      })); 

    this.$watch('project', angular.bind(this, function() { 
     this.testClassStats = undefined; 

     if (this.project) { 
      $xhr(
        'GET', 
        '/test-dashboard/get-test-stats.json?project=' + this.project, 
        angular.bind(this, function(code, response) { 
         this.testClassStats = response.testClassStats; 
        })); 
     } 
    })); 
}; 

TestStats.prototype.greet = function(name) { 
    return "Hello " + name + "!"; 
}; 

TestStats.$inject = ['$xhr']; 

और निम्न परीक्षण:

TestDashboardUnitTest = TestCase("TestDashboardUnitTest"); 

TestDashboardUnitTest.prototype.testAoeu = function() { 
    var xhrStub = function(method, url, callback) { 
    }; 
    var testStats = new TestStats(xhrStub); 
    assertEquals("Hello World!", testStats.greet("Aoeu")); 
}; 

और निम्नलिखित config:

server: http://localhost:9876 

load: 
    - http://code.jquery.com/jquery-1.6.2.min.js 
    - http://code.angularjs.org/angular-0.9.17.min.js 
    - web/*.js 
    - test/*.js 

जब मैं परीक्षण, JsTestDriver आउटपुट चलाएँ:

Total 1 tests (Passed: 0; Fails: 0; Errors: 1) (0.00 ms) 
    Chrome 13.0.782.112 Linux: Run 1 tests (Passed: 0; Fails: 0; Errors 1) (0.00 ms) 
    TestDashboardUnitTest.testAoeu error (0.00 ms): TypeError: Object #<TestStats> has no method '$watch' 
     TypeError: Object #<TestStats> has no method '$watch' 
      at new TestStats (http://127.0.0.1:9876/test/web/test-dashboard.js:13:10) 
      at [object Object].testAoeu (http://127.0.0.1:9876/test/test/test-dashboard-unit-test.js:9:21) 

Tests failed: Tests failed. See log for details. 

इसे ठीक करने के लिए मुझे क्या करने की ज़रूरत है?

उत्तर

5

http://docs.angularjs.org/#!/tutorial/step_05

scope = angular.scope(); 
$browser = scope.$service('$browser'); 

$browser.xhr.expectGET('phones/phones.json') 
    .respond([{name: 'Nexus S'}, 
       {name: 'Motorola DROID'}]); 
ctrl = scope.$new(PhoneListCtrl); 

से हमेशा की तरह काम करते हैं और mocks में पारित न करें। इसके बजाय, इंजेक्शन सिस्टम काम करते हैं।

साथ ही, jsTestDriver.conf फ़ाइल में कोणीय-mocks.js लोड करना सुनिश्चित करें।

+1

हाँ, यह नियंत्रक परीक्षण करने का सही दृष्टिकोण है जो '$ watch' जैसे स्कोप की एपीआई का उपयोग करता है। – Vojta

+0

"इसके अलावा, jsTestDriver.conf फ़ाइल में कोणीय-mocks.js लोड करना सुनिश्चित करें।" क्या आपके द्वारा इसे विस्तार दिया जा सकता है? यह .conf फ़ाइल कहां है? – cdmckay

1

मुझे यकीन है कि क्या कोणीय करता है नहीं कर रहा हूँ, लेकिन मुझे लगता है कि आपकी समस्या कोड के इस ब्लॉक में है:

this.$watch('project', angular.bind(this, function() { 
    // snip 
})); 

आप this.$watch विधि बुला रहे हैं, तो आप एक वस्तु की एक विधि बुला रहे हैं एक वर्ग TestStats का उदाहरण - वह वर्ग जो आपके द्वारा प्रदान किए गए कोड के पहले ब्लॉक में वर्णित है। मुझे वहां कहीं भी $watch नामक विधि दिखाई नहीं दे रही है, शायद आपको किसी अन्य ऑब्जेक्ट संदर्भ की आवश्यकता है, this नहीं?

संबंधित मुद्दे