gpt4 book ai didi

javascript - 为什么嵌套的 describe() block 看不到外部 block 中定义的变量?

转载 作者:IT王子 更新时间:2023-10-29 03:06:19 24 4
gpt4 key购买 nike

我在实际代码中遇到过这个问题,但我举了一个简单的例子来证明这一点。

下面的代码工作正常。我在我的根 describe() block 中设置了一个变量,该变量可在我的子 describe()it() 中访问 block 。

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

http://jsfiddle.net/w5bzrkh9/

但是,如果我尝试通过执行以下操作来稍微干燥我的代码,它就会中断:

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

http://jsfiddle.net/goqcev42/

在嵌套的 describe() 范围内,orchard 对象是未定义的,即使它是在 it() block 中定义的.

Jasmine 的开发人员是否有意这样做,可能是为了避免在 beforeEach() 中重置对象并可能破坏某些引用的问题?他们如何做到这一点?我可以看到这可能有什么用,我只是很好奇它是如何工作的。 (我的猜测是一些 apply()call() 魔法,但我不确定如何...)

--

作为旁注,我仍然可以通过简单地使用另一个 beforeEach() block 来干燥我的代码:

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

最佳答案

describe block 的主体在 beforeEach block 之前执行。

这完全符合预期。问题是您的 var trees 变量在初始化之前试图访问 orcharddescribe block 的主体在beforeEach block 之前执行。要解决这个问题,第三个代码片段是唯一的方法。

Jasmine 将首先执行 describe block ,然后在运行每个测试之前执行 beforeEach block 。

关于javascript - 为什么嵌套的 describe() block 看不到外部 block 中定义的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28546182/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com