Hoe client-side code te testen met NodeUnit?

Dit is een vervolg op mijn vorige vraag .

Stel dat ik het bereken.js bronbestand met de functie bereken aan het gebruik in mijn clientcode

function calculate(num) {
    return num * 2;
}

Nu zou ik het willen testen.

Ik gebruik nodeunit zoals beschreven in dit artikel en exporteren de functie berekenen (zodat tests het kunnen gebruiken).

function calculate(num) {
    return num * 2;
}

exports.calculate = calculate//node.js stuff. won't run in a browser!

De nodeunit -tests zijn in orde, maar ik kan calculate.js in mijn webtoepassing niet langer gebruiken omdat het exports gebruikt.

Nu lijkt het een vangst. Kan ik dit probleem oplossen?

3
Ik denk dat je dit kunt bereiken door mijn antwoord te lezen => stackoverflow.com/a/11191904/11926
toegevoegd de auteur Alfred, de bron

5 antwoord

gebruik een js-testraamwerk dat niet node is, zoals jasminebdd of jstestdriver

3
toegevoegd
Bedankt. Ik wil mijn tests nog steeds uitvoeren op node . AFAIR jstestdriver is Java, dus ik zou het willen vermijden. Kan ik node uitvoeren jamsine ?
toegevoegd de auteur Michael, de bron
Bedankt. Misschien is de oplossing alleen maar om "wrappers met knoopmodules" te maken.
toegevoegd de auteur Michael, de bron
Knooppunt lijkt gewoon een handig hulpmiddel om JavaScript uit te voeren op de opdrachtregel. Dus ik denk erover om het te gebruiken voor unit-testing. Misschien is het echter mijn fout.
toegevoegd de auteur Michael, de bron
lees hiervan misschien om node JS in node JS te laden JS "> stackoverflow.com/questions/5171213/…
toegevoegd de auteur ssmithstone, de bron
ik vraag me gewoon af waarom u het via het knooppunt moet uitvoeren? wanneer het gewoon een simpele JS is
toegevoegd de auteur ssmithstone, de bron

Tests uitvoeren in de browser

Als u een commonjs-indeling voor uw testsuites wilt gebruiken (met   export), is het aan jou om de commonjs-tools voor de   browser. Er zijn een aantal alternatieven en het is belangrijk dat het past   met uw bestaande code, en dat is de reden waarom nodeunit momenteel niet werkt   verstrek dit out of the box.

Ik denk dat je browserify moet bekijken om dit te bereiken.

Browsen

Maak node-style require() werk in de browser met een server-side build   stap, als bij toverslag!

Mocha

Mocha is een eenvoudig, flexibel, leuk JavaScript-testraamwerk voor node.js   en de browser.

Ik denk dat je een kijkje moet nemen bij Mocha gemaakt door TJ (express author), wat ik erg leuk vind (beter dan nodeunit die ik in het verleden heb gebruikt). Met mokka kun je gemakkelijk code-dekking, watch-modus, meldingen en als een grote plus Mocha is meer onderhouden.

2
toegevoegd

Karma runner has a nodeunit adapter to run nodeunit tests in browsers and Phantom JS. Heres an example test entrypoint and Gruntfile using browserify to run tests written in CommonJS modules (exports).

2
toegevoegd

nodeunit-browser-tap + Testling is another option if you're set on nodeunit.

  • The testling npm package gets you command line output for tests run in a local browser.
  • Testling.com gets you free cross browser CI if you host on Github.
  • The browser-tap wrapper gets you nodeunit output that Testling understands.
2
toegevoegd

U kunt geïsoleerde jQuery-logica daadwerkelijk testen binnen de nodeunit zelf. Hier zijn bijvoorbeeld enkele tests die ik schreef voor mijn datepicker-bibliotheek

/*jshint evil:true */
/*global module, require, DatePair */

var fs = require('fs');
// Some of the plugins use jQuery var instead of $
var jQuery = require('jquery');
var $ = jQuery;

// Recreate window and document
var window = { jQuery: jQuery };
var document = window;

// file is included here:
eval(fs.readFileSync('../lib/js/jquery/plugins/jquery.cookie.js') + '');
eval(fs.readFileSync('../lib/js/jquery.timepicker/jquery.timepicker.js') + '');
eval(fs.readFileSync('../lib/js/bootstrap/bootstrap-datepicker.js') + '');
eval(fs.readFileSync('../homepage/js/datepair.js') + '');

// Initialize DatePair Object
var datePair = DatePair(new Date(), {
    dateStart: $('<input type="text" autocomplete="off">'),
    dateEnd: $('<input type="text" autocomplete="off">'),
    timeStart: $('<input type="text" autocomplete="off">'),
    timeEnd: $('<input type="text" autocomplete="off">')
});

module.exports = {
    'Time Delta Var Is 1 hour' : function (test) {
        test.equal(datePair.getTimeDelta(), 3600);
        test.done();
    },
    'Change Date And Check For 1 Hour Difference' : function (test) {
        datePair.startTime.val("10:00pm").change();
        test.equal(datePair.endTime.val(), "11:00pm");
        test.done();
    },
    'Make End Date Move Up One Day' : function (test) {
        var expectedEndDates = [1];
        datePair.startTime.val("11:00pm").change();
        expectedEndDates.push(parseInt(datePair.startDate.val().split("/")[1], 10) + 1);

        test.ok($.inArray(parseInt(datePair.endDate.val().split("/")[1], 10), expectedEndDates) !== -1);
        test.equal(datePair.endTime.val(), "12:00am");
        test.done();
    },
    'Change To 11:30pm Of Previous Day' : function (test) {
        //Move startTime 1 Day Forward
        datePair.startTime.val("11:00pm").change();
        //Move EndDate 1 Day Backwards
        datePair.endTime.val("11:30pm").change();

        test.equal(datePair.endDate.val(), datePair.startDate.val());
        test.done();
    }
}

See full code + library here https://github.com/keithhackbarth/jquery-datetime-picker

0
toegevoegd