2015-06-05 54 views
2

我想將attrs設置爲未定義的單元測試,我嘗試了幾種方法,但未將其設置爲undefined。下面是我的指令:如何將attrs數組設置爲未定義的指令

angular.module('myApp').directive('someElement', function() { 

var directive = {}; 

directive.restrict = 'E'; 
directive.replace = true; 
directive.transclude = true; 

directive.templateUrl = function (element, attrs) { 
    var template = ''; 
    if(attrs) { // would like to invoke this in unit test and set it to `undefined` 
    //do something 
    } 
    return template; 
}; 

directive.scope = {...}; 

directive.compile = function() { 
    //do something 
return directive; 
}); 

這裏是一個片斷,假設指令編譯和$digest週期被觸發。以下是我在測試中得到:

it('should set attrs to undefined', function() { 
    ..... 
    attrs = {}; 
    scope.$apply(); 
    expect(attrs).toBeUndefined(); // I want this to pass!! 
}); 
+1

1日你會怎樣做it..then你怎麼值隔離範圍 –

+1

實現TBH它並沒有真正不管我怎麼樣努力實現,我想問問,如果這是可能的和如何! –

+0

你是否試圖讓它'如果(attrs)attrs = {}'? –

回答

0

它可以從測試中獲得原始指令廠和編譯,甚至單元測試它的方法之前修改它,但我'不知道這種方法測試指令是正確的。 If you take a look at the source code,您可以看到角度寄存器將每個指令註冊爲帶有「指令」後綴的工廠。知道了,你可以注入你的指令,工廠測試:

var directiveFactory; 

beforeEach(inject(function ($injector) { 
    // considering that you directive is called 'myEl' 
    directiveFactory = $injector.get('myElDirective')[0]; 
})); 

在這裏,人們應該用[0]是因爲工廠在陣列返回 - 這是方式與指令,其中有一個選項multiElement: true角的交易(如果您有這個選項啓用,那麼也許這個伎倆將無法正常工作)。

結果變量directiveFactory現在持有的實際出廠,所以原來templateUrl可以被替換,並呼籲未定義ATTRS假:

it('should do something when attrs are undefined', function() { 

    var template = '<my-el></my-el>'; 

    // backup original function 
    var originalTemplateUrl = directiveFactory.templateUrl; 

    // replace with fake one 
    directiveFactory.templateUrl = function (element, attrs) { 
     // call original function with undefined attrs 
     return originalTemplateUrl(element, undefined); 
    }; 

    var element = $compile(template)($scope); 
    $scope.$digest(); 

    // expect whatever 
}); 

現在你可以檢查你的指令的原始templateUrl電話和發現, attrsundefined

See the plunker

相關問題