Пытаясь сегодня провести тесты на простом приложении, которое позволяет вам играть в блэкджек против дилера, который играет по внутренним правилам. Я столкнулся с проблемой компиляции кода CoffeeScript для моих тестовых примеров Jasmine. Оказывается, стандартное форматирование Jasmine не очень хорошо сочетается с ожиданиями компиляции CoffeeScript. Обычно CoffeeScript хорошо справляется с переносом ваших переменных в правильную область. Это известно как лексическая область видимости. Однако Jasmine’s перед каждой функцией не следует общим правилам лексической области видимости. Таким образом, вы должны вручную поднять переменные, объявленные вами в каждой из ваших функций beforeEach, в начало первой функции описания вашего файла test.js. Если вы напишете CoffeeScript ниже, переменные в функции beforeEach не будут доступны в рамках функции описания «теста».

describe -> 
  beforeEach -> 
    var1 = 1 
    var2 = 2 
    var3 = 3 
  describe 'test', -> 
    it "test array should be defined" , -> 
      expect(var1).toEqual 1 
      expect(var2).toEqual 2 
      expect(var2).toEqual 3

В JavaScript он будет отображаться следующим образом:

(function() {
  describe(function() {
    return beforeEach(function() {
      var var1, var2, var3;
      var1 = 1;
      var2 = 2;
      var3 = 3;
      return describe('test', function() {
        return it("test array should be defined", function() {
          expect(var1).toEqual(1);
          expect(var2).toEqual(2);
          return expect(var2).toEqual(3);
        });
      });
    });
  });

}).call(this);

Как видите, переменные var1, var2 и var3 поднимаются наверх анонимной функции в beforeEach. Это приводит к тому, что мы не можем получить доступ к этим переменным в вашей «тестовой» анонимной функции. Чтобы сделать это, мы должны поднять объявления нулевых переменных чуть ниже внешней функции описания. Следующий CoffeeScript сделает это за нас:

describe ->
  var1 = null;
  var2 = null;
  var3 = null;
  
  beforeEach ->
    var1 = 1
    var2 = 2
    var3 = 3

    describe 'test', ->
      it "test array should be defined" , ->
        expect(var1).toEqual 1
        expect(var2).toEqual 2
        expect(var2).toEqual 3

Это скомпилируется в следующий JavaScript

(function() {
  describe(function() {
    var var1, var2, var3;
    var1 = null;
    var2 = null;
    var3 = null;
    return beforeEach(function() {
      var1 = 1;
      var2 = 2;
      var3 = 3;
      return describe('test', function() {
        return it("test array should be defined", function() {
          expect(var1).toEqual(1);
          expect(var2).toEqual(2);
          return expect(var2).toEqual(3);
        });
      });
    });
  });

}).call(this);

Как мы видим сейчас, объявления переменных переносятся во внешнюю функцию описания, что позволяет перед каждым из них изменять свои значения перед выполнением каждого теста. Обычно это не будет проблемой в стандартном кодировании, так как в CoffeeScript мы следуем лексической области видимости.

Первоначально опубликовано 21 ноября 2015 г.