Some posts really get away from me. Like last night's fiasco.
Invariably, the posts that get away from me suffer from the same problem: me trying to do too much at once. Last night I tried setting up a Karma test suite from scratch, to test an AngularJS directive with a Polymer web component. Individually, I can do any of those things relatively quickly (as long as I remember that Angular tests need angular-mock, sheesh). Put them together, however, and 2 or 3 three things that don't quite work might as well be 20.
So tonight, I do what I really ought to know by now: bite off smaller chunks. Even though I have my Angular tests running again, there seems to be something not quite right with my Polymer tests. Thanks to my work in Patterns in Polymer, I have a fairly reliable Karma, Jasmine, and Polymer setup, so this annoys me. To eliminate this annoyance, I focus solely on it.
I comment out the various setup blocks from my tests that initialize Angular and the stuff that gets injected to work with directives. I update my
karma.conf.js
so that only the tests and Polymer setup are loaded on the test page: // ...
// list of files / patterns to load in the browser
files: [
'test/PolymerSetup.js',
// 'bower_components/angular/angular.js',
// 'bower_components/angular*/angular-*.js',
// 'angular_bind_polymer.js',
{pattern: 'bower_components/**', included: false, served: true},
'test/*Spec.js'
],
// ...
I will pull back in the Angular stuff once I have Polymer sorted out. As for Polymer, my setup remains as it had been in Patterns in Polymer. I dynamically add a <script>
tag to load in the polymer platform and then wait for the polymer-ready
event before proceeding with tests in the test/*Spec.js
files:script.src = "/base/bower_components/platform/platform.js"; document.getElementsByTagName("head")[0].appendChild(script); // Delay Jasmine specs until polymer-ready var POLYMER_READY = false; beforeEach(function(done) { window.addEventListener('polymer-ready', function(){ POLYMER_READY = true; }); waitsFor(function(){return POLYMER_READY;}); });I assume that works since I copied and pasted it from book tests that still pass. What I am unsure about is how to add dynamic Polymer element definitions to the page. When testing real polymer elements, I can dynamically create the
<link>
import in PolymerSetup (after the platform is initialized):var link = document.createElement("link"); link.rel = "import"; link.href = "/base/elements/x-pizza.html"; document.getElementsByTagName("head")[0].appendChild(link);I do not have a real element in this case. I just need a dummy Polymer element against which I can run my data-binding test. So instead of putting those files in a separate Polymer definition file and dynamically creating the
<link>
import element, I try to dynamically add the definition right to the page:var double_el = document.createElement('polymer-element'); double_el.setAttribute('name', 'x-double'); double_el.setAttribute('attributes', 'in out'); double_el.innerHTML = '<script>\n' + 'Polymer("x-double", {\n' + ' in: 13,\n' + ' ready: function(){ ' + ' console.log("+++++")' + ' this.inChanged();' + ' console.log("+++++")' + ' },\n' + ' inChanged: function(){\n' + ' console.log("u0000000");\n' + ' this.out = parseInt(this.in) * 2;\n' + ' }\n' + '});\n' + '</script>\n'; document.body.appendChild(double_el);For good measure, I also pull in the Polymer library itself (only the platform was loaded previously):
var link = document.createElement("link"); link.rel = 'import'; link.href = "/base/bower_components/polymer/polymer.html"; document.getElementsByTagName("head")[0].appendChild(link);With that, I get… nothing. No console statements printed and no errors.
Still, that tells me something. Since there are no errors, the call to
Polymer
inside the <script>
tags is working. The element definition even shows up in the DOM inspector:Rather than try to solve multiple issues tonight, I really am just going to do the simplest thing that should work: moving the Polymer element definition out into a separate file. First, I will serve this fixture definition in Karma (but not load it by default):
// ...
// list of files / patterns to load in the browser
files: [
'test/PolymerSetup.js',
// 'bower_components/angular/angular.js',
// 'bower_components/angular*/angular-*.js',
// 'angular_bind_polymer.js',
{pattern: 'bower_components/**', included: false, served: true},
{pattern: 'test/*.html', included: false, served: true},
'test/*Spec.js'
],
// ...
Then, I create my dummy Polymer element as test/x-double.html
:<link rel="import" href="../bower_components/polymer/polymer.html"> <polymer-element name="x-double" attributes="in out"> <script> Polymer("x-double", { in: 13, ready: function(){ console.log("+++++") this.inChanged(); console.log("+++++") }, inChanged: function(){ console.log("u0000000"); this.out = parseInt(this.in) * 2; } }); </script> </polymer-element>And that work just fine. All of those debug console statements pass. My test checking the doubling passed. Everything.
So it seems that something about the way that I am dynamically adding the element definition to my test page is wrong. Armed with the knowledge that the Polymer definition itself is sound, I am ready to try the next small steps.
Tomorrow.
Day #42
No comments:
Post a Comment