Jasmine and Requirejs in Resharper 7

蹲街弑〆低调 提交于 2019-12-01 06:39:42

Use a named requireJS Module

define("my/sut", function () {

    var MySut = function () {
        return {
            answer: 42
        };
    };
    return MySut;
});

And initialize the SUT with the asyncronus support of Jasmine. Don't forgot the references!

/// <reference path="~/Scripts/require.js"/>
/// <reference path="../code/sut.js" />

describe("requireJS with Jasmine and Resharper", function () {

    it("should be executed", function () {

        // init SUT async
        var sut;
        runs(function () {
            require(['my/sut'], function (MyModel) {
                sut = new MyModel();
            });
        });
        waitsFor(function () {
            return sut;
        }, "The Value should be incremented", 100);

        // run the test
        runs(function () {
            expect(sut.answer).toBe(42);
        });
    });
});

I hope this works with more modules. In my case it worked with waitsFor '0' ms.

A simplified version of mgsdev response, put the loading code in a beforeEach statement, that way you can write short expectations.

module:

define("stringCalculator", function () {
    return {
        calculate: function (string) {
            var result = 0;
            string.split("+").forEach(function(number) {
                result += parseInt(number);
            });
            return result;
        }
    };
});

test file: if calculator is undefined it will try to load it before every expectation.

/// <reference path="~/Scripts/require.js"/>
/// <reference path="~/code/stringCalculator.js"/>

describe("string calculator", function () {
    var calculator;

    beforeEach(function () {    
        if (!calculator) {
            require(["stringCalculator"], function (stringCalculator) {
                calculator = stringCalculator;
            });

            waitsFor(function () {
                return calculator;
            }, "loading external module", 1000);
        }
    });

    it("should add 1 and 2", function () {
        var result = calculator.calculate("1+2");
        expect(result).toEqual(3);
    });

    it("should add 2 and 2", function () {
        var result = calculator.calculate("2+2");
        expect(result).toEqual(4);
    });

    it("should add 1, 2 and 3", function() {
        var result = calculator.calculate("1+2+3");
        expect(result).toEqual(6);
    });
});

If you use Jasmine 2.0 or newer, you can support asynchronous calls in your code. Just pass the done parameter into the function for your it unit test, then call done() when you have loaded your modules:

describe("add function", function(){
   it("calls renderNew", function(done){
      define("taskRenderer", [], function() {
         return {
            renderNew: function(){}
         };
      });

      require(["taskRenderer"], function(taskRenderer) {
         spyOn(taskRenderer, "renderNew");
         taskRenderer.renderNew();
         expect(taskRenderer.renderNew).toHaveBeenCalled();
         done();
      });
   }
}

This way, you don't actually perform your test until the modules are loaded and the test doesn't prematurely get marked as finished.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!