2013-04-25 71 views
4

我試圖在Visual Studio 2012中使用jasmine和Resharper 7運行一些JavaScript代碼。我在requirejs的幫助下遵循AMD模式。但是,我還沒有設法讓我的測試在Resharper測試運行器中運行。Resharper中的Jasmine和Requirejs 7

有沒有人設法做類似的事情?

+0

問題是requirejs在異步加載模塊後運行代碼,在此期間頁面加載正確並且Jasmine記錄沒有測試運行並且已經完成,然後Resharper殺死進程並報告結果。 總而言之,在進程終止之前,requirejs模塊不會被加載\執行。在與requirejs一起使用時,這是Resharper,Chutzpah,Karma和其他跑步者的常見問題。 – 2013-05-01 09:42:54

回答

5

使用一個名爲requireJS模塊

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

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

並初始化與asyncronus支持茉莉花的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); 
     }); 
    }); 
}); 

我希望這可以用更多的模塊。在我的情況下,它與waitsFor'0'ms一起工作。

+1

使用命名模塊並引用它們會破壞使用require的目的。如果我這樣做,不僅我將模塊名稱與文件名和代碼重複,而且還必須引用所有涉及的模塊。 – 2014-03-13 15:34:15

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或更新版本,您可以在代碼中支持異步調用。只需通過參數爲您單元測試的功能,然後調用()完成當您已加載模塊:

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

這樣,你不實際執行測試直到模塊被加載並且測試不會過早地被標記爲完成。