visual-studiojasminejasmine-jquerychutzpah

Unable to get jasmine-jquery fixtures to load in Visual Studio with Chutzpah, or even in browser


I'm prototyping a MVC.NET 4.0 application and am defining our Javascript test configuration. I managed to get Jasmine working in VS2012 with the Chutzpah extensions, and I am able to run pure Javascript tests successfully.

However, I am unable to load test fixture (DOM) code and access it from my tests.

Here is the code I'm attempting to run:

test.js

/// various reference paths...

jasmine.getFixtures().fixturesPath = "./";

describe("jasmine tests:", function () {
    it("Copies data correctly", function () {
        loadFixtures('testfixture.html');
        //setFixtures('<div id="wrapper"><div></div></div>');
        var widget = $("#wrapper");
        expect(widget).toExist();
    });
});

The fixture is in the same folder as the test file. The setFixtures operation works, but when I attempt to load the HTML from a file, it doesn't. Initially, I tried to use the most recent version of jasmine-jquery from the repository, but then fell back to the over 1 year old download version 1.3.1 because it looked like there was a bug in the newer one. Here is the message I get with 1.3.1:

Test 'jasmine tests::Copies data correctly' failed Error: Fixture could not be loaded: ./testfixture.html (status: error, message: undefined) in file:///C:/Users/db66162/SvnProjects/MvcPrototype/MvcPrototype.Tests/Scripts/jasmine/jasmine-jquery-1.3.1.js (line 103)

When I examine the source, it is doing an AJAX call, yet I'm not running in a browser. Instead, I'm using Chutzpah, which runs a headless browser (PhantomJS). When I run this in the browser with a test harness, it does work.

Is there someone out there who has a solution to this problem? I need to be able to run these tests automatically both in Visual Studio and TeamCity (which is why I am using Chutzpah). I am open to solutions that include using another test runner in place of Chutzpah. I am also going to evaluate the qUnit testing framework in this effort, so if you know that qUnit doesn't have this problem in my configuration, I will find that useful.


Solution

  • I eventually got my problem resolved. Thank you Ian for replying. I am able to use PhantomJS in TeamCity to run the tests through the test runner. I contacted the author of Chutzpah and he deployed an update to his product that solved my problem in Visual Studio. I can now run the Jasmine test using Chutzpah conventions to reference libraries and include fixtures while in VS, and use the PhantomJS runner in TeamCity to use the test runner (html).

    My solution on TeamCity was to run a batch file that launches tests. So, the batch:

    @echo off
    REM -- Uses the PhantomJS headless browser packaged with Chutzpah to run 
    REM -- Jasmine tests.  Does not use Chutzpah.
    setlocal
    set path=..\packages\Chutzpah.2.2.1\tools;%path%;
    echo ##teamcity[message text='Starting Jasmine Tests']
    phantomjs.exe phantom.run.js %1
    echo ##teamcity[message text='Finished Jasmine Tests']
    

    And the Javascript (phantom.run.js):

    // This code lifted from https://gist.github.com/3497509.
    // It takes the test harness HTML file URL as the parameter.  It launches PhantomJS,
    // and waits a specific amount of time before exit.  Tests must complete before that 
    // timer ends.  
    (function () {
        "use strict";
        var system = require("system");
        var url = system.args[1];
    
        phantom.viewportSize = {width: 800, height: 600};
    
        console.log("Opening " + url);
    
        var page = new WebPage();
    
        // This is required because PhantomJS sandboxes the website and it does not
        // show up the console messages form that page by default
        page.onConsoleMessage = function (msg) {
            console.log(msg);
    
            // Exit as soon as the last test finishes.
            if (msg && msg.indexOf("Dixi.") !== -1) {
                phantom.exit();
            }
        };
    
        page.open(url, function (status) {
            if (status !== 'success') {
                console.log('Unable to load the address!');
                phantom.exit(-1);
            } else {
                // Timeout - kill PhantomJS if still not done after 2 minutes.
                window.setTimeout(function () {
                    phantom.exit();
                }, 10 * 1000); // NB: use accurately, tune up referring to your needs
            }
        });
    }());