2014-10-17 4 views
1

Я уже рассмотрел this Q & Связанный с директивами выделенные области, которые помогли мне разрешить тестирование атрибута, который использовал свойство '@'; но мне сложно тестировать атрибуты, которые используют свойство '='.Тестирование атрибута изолированного объема по директиве

Рассмотрим (от моей директивы называется предстоящая):

return { 
     restrict: 'A', 
     link: link, 
     scope: { 
      upcoming: '@', 
      patientDetails: '=' 
     } 
    }; 

В моем тесте для upcoming я могу получить доступ к нему (с угловым 1,2 года) с помощью функции isolateScope() следующим образом:

elm = angular.element('<div upcoming="remembered" patient-details="patientDetails"></div>'); 

    // Compiles the directive and links it to the scope 
    $compile(elm)(scope); 
    scope.$digest(); 
    isolateScope = elm.isolateScope(); 

И в тестах я могу это сделать:

it("should have attribute 'upcoming' attached to isolate scope", function() { 
    expect(isolateScope.upcoming).toBeDefined(); 
    expect(isolateScope.upcoming).toBe('remembered'); 
}); 

Но если я pproach другое свойство таким же образом, я получаю ошибку undefined. Затем я попытался это:

// Retrieve the target html - remembered.html 
beforeEach(inject(function ($compile) { 
    patient = { 
     name: 'Lorem Ipsum', 
     readyForRefill: 1, 
     progressCount: 2, 
     upcomingCount: 3, 
     taggedCount: 4, 
     expiringCount: 5, 
     oneRefillRemaining: 9000 
    }; 
    elm = angular.element('<div upcoming="remembered" patient-details="patient"></div>'); 

    // Compiles the directive and links it to the scope 
    $compile(elm)(scope); 
    scope.$digest(); 
    isolateScope = elm.isolateScope(); 
    isolateScope.patientDetails = patient; 
})); 

Тест:

it("should have attribute 'patientDetails' attached to isolate scope", function() { 
    expect(isolateScope.patientDetails).toBeDefined(); 
}); 

проходит, но я чувствую, что это тестирование не то.

Может ли это пояснить это для меня, пожалуйста?

EDIT

Делать то, что tasseKATT предложил решить эту проблему, но случилось сломать 5 других тестов. Эти тесты в основном исследовали фактический загружаемый шаблон и определили, какое содержимое они имели. Например:

it("ul should contain 4 li", function() { 
    var li = elm.find('li'); 
    expect(li.length).toBe(4); 
}); 

больше не действует как elm элемент теперь <div upcoming="remembered" patient-details="patient"></div> HTML, в отличие от одного загруженного с помощью шаблона:

<p><a href=""><b>Sign in</b></a> to view your full <br>prescription statuses.</p> 
<ul> 
    <li><span>{{patientDetails.readyForRefill}}</span> Prescriptions Ready for Refill</li> 
    <li><span>{{patientDetails.readyForRefill}}</span> ReadyFill<sup>&#174;</sup> 
    <li><span>{{patientDetails.expiringCount}}</span> Expiring Prescriptions</li> 
    <li><span>{{patientDetails.oneRefillRemaining}}</span> Prescriptions with 1 Refill Left</li> 
</ul> 

Есть ли прочь загрузить как правильно? Хотя стоит отметить, что в зависимости от того, кто вступает в систему, шаблон изменится, так что это сделает любую попытку подсчета div и тэгов, не имеющих отношения к тестам?

Благодаря

ответ

1

Если вы хотите, чтобы убедиться, что сфера применения директивы получает передается правильными детали пациента объект, который вы должны поместить его в области, прежде чем элемент собран. Затем вы можете получить его через isolateScope() и выполнить ваши проверки.

Например:

elm = angular.element('<div upcoming="remembered" patient-details="patient"></div>'); 

scope = $rootScope.$new(); 

scope.patient = { 
    name: 'Lorem Ipsum', 
    readyForRefill: 1, 
    progressCount: 2, 
    upcomingCount: 3, 
    taggedCount: 4, 
    expiringCount: 5, 
    oneRefillRemaining: 9000 
}; 

$compile(elm)(scope); 
isolateScope = elm.isolateScope(); 

И:

it("should work", function() { 
    expect(isolateScope.patientDetails).toBeDefined(); 
    expect(isolateScope.patientDetails.name).toBe('Lorem Ipsum'); 
}); 

Update:

Если вам действительно нужно, чтобы проверить сгенерированный код, вы должны использовать скомпилированные элемент:

compiled = $compile(elm)(scope); 

... 

it("ul should contain 4 li", function() { 
    var li = compiled.find('li'); 
    expect(li.length).toBe(4); 
}); 
+0

Это решило мою проблему, но случилось, чтобы сломать некоторые другие тесты - см. Мое редактирование относительно того, что он делает – Katana24

+0

Я добавил обновление к своему ответу. – tasseKATT

+0

Я сделал то, что вы сказали, но тесты все еще терпят неудачу на основе предыдущих исправлений - чтобы обойти это, мне придется загружать его в предыдущем порядке, но создать другой элемент для его размещения - хороший или плохой? – Katana24