Пытаясь сегодня провести тесты на простом приложении, которое позволяет вам играть в блэкджек против дилера, который играет по внутренним правилам. Я столкнулся с проблемой компиляции кода 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 г.