Jasmine和Requirejs在Resharper 7中的应用

4

我正在尝试在Visual Studio 2012中使用Jasmine和Resharper 7运行一些JavaScript代码。我遵循了借助RequireJS的AMD模式,但是我还没有成功地使我的测试在Resharper测试运行器中运行。

有人成功地做到了类似的事情吗?


问题在于requirejs在异步加载模块后运行代码,在此期间页面正确加载,Jasmine记录没有运行测试并已完成,Resharper然后终止进程并报告结果。总之,requirejs模块在进程终止之前未被加载\执行。这是使用requirejs时与Resharper、Chutzpah、Karma和其他运行器常见的问题。 - Mark Broadhurst
3个回答

5
使用命名的requireJS模块
define("my/sut", function () {

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

使用Jasmine异步支持初始化SUT。别忘了引用相关内容!

/// <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);
        });
    });
});

我希望这适用于更多的模块。在我的情况下,它与等待'0'毫秒一起工作。


1
使用命名模块并引用它们有点违背了使用 require 的初衷。如果我这样做,不仅文件名和代码中都会重复模块名称,而且还必须引用所有涉及的模块。 - Thomas Eyde

1

以下是对mgsdev回答的简化版本,将加载代码放在beforeEach语句中,这样您就可以编写简短的期望。

模块:

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

测试文件: 如果计算器未定义,则会在每个期望之前尝试加载它。

/// <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);
    });
});

0
如果您使用Jasmine 2.0或更高版本,您可以在代码中支持异步调用。只需将done参数传递到您的it单元测试函数中,然后在加载模块时调用done()即可:
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();
      });
   }
}

这样,直到模块被加载并且测试不会过早地被标记为完成,您才会实际执行测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接