Я столкнулся с этой проблемой в реальном коде, но я собрал тривиальный пример, чтобы доказать эту точку.
Нижеприведенный код работает нормально. Я установил переменную в моем корневом блоке describe()
, который доступен в моих блоках sub describe()
s 'it()
.
describe('simple object', function () {
var orchard;
beforeEach(function () {
orchard = {
trees: {
apple: 10,
orange : 20
},
bushes: {
boysenberry : 40,
blueberry: 35
}
};
});
describe('trees', function () {
it ('should have apples and oranges', function() {
var trees = orchard.trees;
expect (trees.apple).toBeDefined();
expect (trees.orange).toBeDefined();
expect (trees.apple).toEqual(10);
expect (trees.orange).toEqual(20);
});
it ('should NOT have pears or cherries', function() {
var trees = orchard.trees;
expect (trees.pear).toBeUndefined();
expect (trees.cherry).toBeUndefined();
});
});
});
Однако, если я попытаюсь немного ПОЛУЧИТЬ мой код, выполнив следующее, он сломается:
describe('simple object', function () {
var orchard;
beforeEach(function () {
orchard = {
trees: {
apple: 10,
orange : 20
},
bushes: {
boysenberry : 40,
blueberry: 35
}
};
});
describe('trees', function () {
var trees = orchard.trees; // TypeError: Cannot read property 'trees' of undefined
it ('should have apples and oranges', function() {
expect (trees.apple).toBeDefined();
expect (trees.orange).toBeDefined();
expect (trees.apple).toEqual(10);
expect (trees.orange).toEqual(20);
});
it ('should NOT have pears or cherries', function() {
expect (trees.pear).toBeUndefined();
expect (trees.cherry).toBeUndefined();
});
});
});
В пределах вложенной области describe()
объект orchard
имеет значение undefined, хотя он определен внутри блоков it()
внутри него.
Является ли это преднамеренным со стороны разработчиков Jasmine, возможно, чтобы избежать проблем с сбросом объекта в beforeEach()
и возможного нарушения некоторых ссылок? Как они это делают? Я мог видеть, как это может быть полезно, мне очень любопытно, как это работает. (Мое предположение - это магия apply()
или call()
, но я не уверен, как...)
-
В качестве побочной заметки я все еще могу сушить свой код, просто используя другой блок beforeEach()
:
describe('simple object', function () {
var orchard;
beforeEach(function () {
orchard = {
trees: {
apple: 10,
orange : 20
},
bushes: {
boysenberry : 40,
blueberry: 35
}
};
});
describe('trees', function () {
var trees;
beforeEach(function() {
trees = orchard.trees;
});
it ('should have apples and oranges', function() {
expect (trees.apple).toBeDefined();
expect (trees.orange).toBeDefined();
expect (trees.apple).toEqual(10);
expect (trees.orange).toEqual(20);
});
it ('should NOT have pears or cherries', function() {
expect (trees.pear).toBeUndefined();
expect (trees.cherry).toBeUndefined();
});
});
});