Testing DOM manipulating in Jasmine test

27,520

Solution 1

For setting up HTML fixtures in my specs, I wrote jasmine-fixture. With it, you can do stuff like this:

var $foo, $input;
beforeEach(function(){
  $foo = affix('.foo');
    # appends to the DOM <div class="foo"></div> 
  $input = $foo.affix('input[id="name"][value="Jim"]');
    # appends <input id="name" value="Jim"/> beneath the .foo div

And afterEach, it'll clean up after you.

For expectations about the state of the DOM, I use jasmine-jquery. It offers a ton of matchers like the one below:

it('is named Jim', function(){
  expect($input).toHaveValue("Jim");
});

Solution 2

I suppose you could perform your action, then check the href on the first script tag like so:

function addGA(){
    var ga = document.createElement('script'); 
    ga.type = 'text/javascript'; ga.async = true;
    ga.src = 
      ('https:' == document.location.protocol ? 'https://ssl' : 'http://www')
      + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; 
    s.parentNode.insertBefore(ga, s);
};

Jasmine spec:

 var href = 'http://www.google-analytics.com/ga.js';
 expect(document.getElementsByTagName('script')[0].href).not.toEqual(href);
 addGa();
 expect(document.getElementsByTagName('script')[0].href).toEqual(href);

Would be interested in hearing a better method, though. Checking the DOM with Jasmine always feels a little hacky.

Solution 3

For heavy DOM testing with Jasmine you can use Jasmine Headless WebKit.

Share:
27,520
Sławosz
Author by

Sławosz

Hi, I am programmer experienced in: Ruby Rails Golang Javascript These are topics that I like to explore: lxc and docker algorithms service oriented architecture: communication, messeges, etc. Some links about me: slawosz.github.com github.com/slawosz www.linkedin.com/in/slawosz

Updated on July 09, 2022

Comments

  • Sławosz
    Sławosz about 2 years

    I'm creating a js widget and first part is to add script width javascript, something like this (example from google analytics):

    (function() {
        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
    })();
    

    How to test it with jasmine (using fixtures?)?