Resharper 7中的茉莉花和Requirejs
我试图在VisualStudio2012中使用jasmine和Resharper 7运行一些JavaScript代码。我在requirejs的帮助下遵循AMD模式。但是,我还没有成功地在Resharper测试运行程序中进行测试运行Resharper 7中的茉莉花和Requirejs,resharper,requirejs,jasmine,Resharper,Requirejs,Jasmine,我试图在VisualStudio2012中使用jasmine和Resharper 7运行一些JavaScript代码。我在requirejs的帮助下遵循AMD模式。但是,我还没有成功地在Resharper测试运行程序中进行测试运行 有人做过类似的事情吗?使用命名的requireJS模块 define("my/sut", function () { var MySut = function () { return { answer: 42
有人做过类似的事情吗?使用命名的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);
});
});
});
//
///
描述(“带Jasmine和Resharper的requireJS”,函数(){
它(“应该执行”,函数(){
//初始化SUT异步
萨特变种;
运行(函数(){
require(['my/sut'],函数(MyModel){
sut=新的MyModel();
});
});
waitsFor(函数(){
返回sut;
},“值应递增”,100);
//运行测试
运行(函数(){
期望(sut.答案),托比(42);
});
});
});
我希望这能与更多模块一起工作。在我的例子中,它与“0”ms的waits一起工作。一个简化版的mgsdev响应,将加载代码放在beforeach语句中,这样您就可以编写简短的期望 模块:
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);
});
});
//
///
描述(“字符串计算器”,函数(){
var计算器;
beforeach(函数(){
如果(!计算器){
需要([“stringCalculator”],函数(stringCalculator){
计算器=字符串计算器;
});
waitsFor(函数(){
返回计算器;
}“加载外部模块”,1000);
}
});
它(“应添加1和2”,函数(){
var结果=计算器。计算(“1+2”);
期望(结果)。toEqual(3);
});
它(“应添加2和2”,函数(){
var结果=计算器。计算(“2+2”);
期望(结果)toEqual(4);
});
它(“应添加1、2和3”,函数(){
var结果=计算器。计算(“1+2+3”);
期望(结果)。toEqual(6);
});
});
如果您使用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();
});
}
}
这样,在模块加载之前,您实际上不会执行测试,并且测试不会过早地被标记为已完成。问题是,requirejs在异步加载模块后运行代码,在此期间页面正确加载,Jasmine记录没有测试运行且已完成,然后,Resharper终止进程并报告结果。总之,在流程终止之前,不会加载\执行requirejs模块。这是Resharper、Chutzpah、Karma和其他跑步者在与requirejs一起使用时的一个常见问题。使用命名模块并引用它们有点违背了使用require的目的。如果我这样做,我不仅要在文件名和代码中复制模块名,还要引用所有涉及的模块。