2016-08-08 6 views
0

В моем приложении meteor я хочу проверить, был ли определенный шаблон обработан для определенного маршрута/пути. Моя текущая настройка включает в себя следующее: iron: router, practmeteor: mocha, и я использую для Blaze для рендеринга.Как проверить, предоставлен ли шаблон для утюга: маршрут маршрутизатора в тесте мокко?

Есть два вопроса, в частности, что я не могу получить, чтобы работать:

  • ждет маршрут до конца без использования SetTimeout (я предпочел бы обратный вызов какой-то)
  • выяснить, действительно ли на странице не отображается шаблон Blaze.

Как я могу проверить, предоставил ли шаблон после вызова Router.go()?

import { Router } from 'meteor/iron:router'; 
import { Template } from 'meteor/templating'; 
import { chai } from 'meteor/practicalmeteor:chai'; 

Router.route('/example', { name: 'exampleTemp' }); 

describe('example route', function() { 
    it('renders template exampleTemp', function() { 
     Router.go('/example'); 
     // not sure what to put here to wait for route to finish 

     // don't know how to achieve the function below 
     chai.assert.isTrue(Template.exampleTemp.isRendered()); 
    }); 
}); 
+0

Что делать, если вы проверили, загружен ли какой-либо уникальный элемент DOM? Может быть, что-то с определенным ID или именем класса? – CodeChimp

+0

@CodeChimp Я хочу, чтобы увидеть, отображен ли сам шаблон. Чтобы я знал, что маршрут работает нормально, даже если html для шаблона изменяется. Я опубликовал уродливую рабочую версию в качестве ответа, но я думаю, что, возможно, это более элегантный способ добиться этого. – DavidC

ответ

0

Это не идеальное решение, потому что оно перезаписывает крюк onAfterAction, если у вас есть определенный. Кроме того, он добавляет onRendered функции шаблонов, которые создают грязный среды тестирования

маршрутизатора-helpers.test.js

import { Template } from 'meteor/templating'; 
import { Tracker } from 'meteor/tracker'; 
import { Router } from 'meteor/iron:router'; 

export const withRenderedRoute = function(templates, callback) { 
    let routeRendered = new ReactiveVar(false); 
    Router.onAfterAction(function() { 
     routeRendered.set(true); 
    }); 
    let templatesRendered = []; 
    if (Array.isArray(templates)) { 
     templates.forEach(function(templateName) { 
      let rendered = new ReactiveVar(false); 
      Template[templateName].onRendered(function() { 
       rendered.set(true); 
      }); 
      templatesRendered.push(rendered); 
     }); 
    } 
    Tracker.autorun(function() { 
     const areTemplatesRendered = templatesRendered.every(function(rendered) { 
      return rendered.get(); 
     }); 
     if (routeRendered.get() && areTemplatesRendered) { 
      Router.onAfterAction(function() {}); 
      if (callback) { 
       callback(); 
      } 
     } 
    }); 
}; 

router.test.html

<template name="dummyLayout">{{> yield}}</template> 
<template name="dummyTemplate"></template> 

router.test.js

import { chai } from 'meteor/practicalmeteor:chai'; 
import { withRenderedRoute } from './router-helpers.test.js'; 
import './router.test.html'; 
import './router.js'; 

const RoutesToTest = [ 
    { name: 'home', path: '/', template: 'home', layout: 'layoutDefault' } 
    // more routes 
]; 

describe('router', function() { 
    before(function() { 
     Router.route('/dummyRoute', { name: 'dummyRoute', template: 'dummyTemplate', layoutTemplate: 'dummyLayout' }); 
    }); 
    beforeEach(function(done) { 
     Router.go('dummyRoute'); 
     withRenderedRoute(['dummyTemplate'], done); 
    }); 
    after(function() { 
     Router.go('/'); 
    }); 
    RoutesToTest.forEach(function(testRoute) { 
     let message = 'route ' + testRoute.name + ' with path ' + testRoute.path; 
     message += ' should render template ' + testRoute.template + ' with layout ' + testRoute.layout; 
     it(message, function(done) { 
      Router.go(testRoute.name); 
      withRenderedRoute([testRoute.template, testRoute.layout], function() { 
       // the route and templates have been rendered correctly at this point, otherwise the test will timeout 
       chai.assert.equal(Router.routes[testRoute.name].path(), testRoute.path); 
       done(); 
      }); 
     }); 
    }); 
}); 

 Смежные вопросы

  • Нет связанных вопросов^_^