2013-05-11 28 views
1

考慮的下面的代碼在兩個片段,從the angular docs on unit testing採取:角度控制器:這些神奇的方法在這個單元測試中是如何工作的?

在角控制器是嚴格,這導致更簡單的可測性的故事,在這個例子中可以看出的DOM操作邏輯分隔:

function PasswordCtrl($scope) { 
    $scope.password = ''; 
    $scope.grade = function() { 
    var size = $scope.password.length; 
    if (size > 8) { 
     $scope.strength = 'strong'; 
    } else if (size > 3) { 
     $scope.strength = 'medium'; 
    } else { 
     $scope.strength = 'weak'; 
    } 
    }; 
} 

和測試是直截了當

var pc = new PasswordCtrl(); 
pc.password('abc'); 
pc.grade(); 
expect(pc.strength).toEqual('weak'); 

我想知道第二個代碼片段是如何工作的。沒有模擬$範圍被傳遞給它,但顯然它的工作原理。此外,該方法調用pc.password('abc');pc.grade()似乎是$scope.password('abc')$scope.grade()的別名,但這些別名從何而來?這是東西內置角?一種等同於ruby的method_missing?如果是這樣,它是如何工作的?

+0

您確定此測試有效嗎?你能否提供活躍的例子?它感覺很腥。 – 2013-05-11 09:46:46

+0

它來自官方的角度文檔,正如我在OP中鏈接的那樣,所以我認爲它是有效的。他們沒有提供關於如何設置的細節,所以我沒有嘗試自己運行它。 – Jonah 2013-05-11 09:48:26

+0

@ pkozlowski.opensource,另外,我看到你寫了一本關於angular的即將發佈的書,所以如果你有其他關於angular測試的單元測試教程的建議,我會很感激他們。 – Jonah 2013-05-11 10:05:47

回答

0

不,它不工作。如果我只是將你在這裏的東西粘貼到2個文件中並告訴業力運行它,我會得到以下錯誤。錯誤,符合市場預期,是:

Chrome 26.0 (Mac) ERROR 
    Uncaught TypeError: Cannot set property 'password' of undefined 
    at /Volumes/.../utest/test/ctrl.js:2 Chrome 
26.0 (Mac): Executed 0 of 0 ERROR (0.173 secs/0 secs) 

其中ctrl.js:2是:

$scope.password = ''; 

的AngularJS文檔是不幸的是沒有明確。所有測試必須在describe區塊內進行,因此文檔必須假定讀者知道模擬beforeEach區塊所需的$範圍。

+0

這是無益的,並不回答這個問題。我非常懷疑官方的角度文檔是錯誤的。你更不可能理解這個例子是如何實施的,因爲這些文件不清楚,這本身並不是犯罪。但是,看起來你還沒有理解它們,所以這不能作爲我的問題的答案。 – Jonah 2013-05-11 15:43:54

+0

我想我希望傳達的是代碼不起作用。你的問題是:「我想知道第二個代碼片段是如何工作的,沒有模擬$ scope被傳遞給它,但顯然它工作。」答案是:不,你必須嘲笑$範圍。我會在答案中明確說明。 – marcoseu 2013-05-11 15:57:01

+0

如果這是您的說法,那麼存在一個隱含的後續問題:爲什麼文檔有一個不起作用的示例?需要什麼來使其工作?聲稱官方的角度文件有完全錯誤的例子,根本沒有意義,需要證據和解釋。 – Jonah 2013-05-11 16:03:10

相關問題