我有以下情况:
describe('Base test suite', function () {
beforeEach(function (done) {
// an initialization routine with done as the callback
veryLongInitialization(done);
});
it('description of first spec', function (done) {
// first expectations
done();
});
describe('nested suite that builds upon the base test suite', function () {
beforeEach(function (done) {
secondVeryLongInitialization(done);
});
it('description of second spec', function (done) {
// second expectations
});
});
describe('second nested suite that builds upon the base test suite', function () {
beforeEach(function (done) {
thirdVeryLongInitialization(done);
});
it('description of third spec', function (done) {
// third expectations
});
});
});
如您所见,我们有一些嵌套的测试套件。外部beforeEach
在内部veryLongInitialization
之前被调用非常重要。
veryLongInitialization
必须已完成。secondVeryLongInitialization
和veryLongInitialization
已按顺序执行,并且已成功完成。thirdVeryLongInitialization
和veryLongInitialization
已按顺序执行,并且已成功完成。到目前为止效果非常好。
然而,在第一个规范中有许多期望,所以基本上不可能为它写一个简短的描述。
所以我们考虑将第一个规格分成几个规格,每个规格只有几个期望。这样可以轻松编写有意义的简短规范说明。
然而,会降低整个测试执行速度,因为必须为每个规范执行veryLongInitialization
。
因此我们考虑将beforeAll
放入beforeEach
块而不是veryLongInitialization
。这只会执行veryLongInitialization
一次,然后运行所有规范,从而加快整体测试执行速度。
然而,这意味着veryLongInitialization()
secondVeryLongInitialization()
thirdVeryLongInitialization()
只会运行一次。这意味着第三个规范将在序列
secondVeryLongInitialization
这是不正确的。 it('should do this', function () {
...
}).and('should do that', function () {
...
}).and('should also behave like this', function () {
...
}).and('should also behave like that', function () {
...
});
不应该在第三个规范之前运行。
我希望你看到我们的困境。 这种情况有更好的方法吗?
我们希望看到的是将规范组合在一起的一些方法,例如:
beforeEach
这些规范将在一次测试运行中运行,所有这些规范只有一个if(!ispostback){
}
。
答案 0 :(得分:1)
我认为这可行:将第一步规格合并到单独的describe
并在所有规则之前运行veryLongInitialization
。之后,在每个veryLongInitialization
和describe
之前运行secondVeryLongInitialization
。第三步也是如此。这样您就必须运行veryLongInitialization
三次,但根据您的描述,它实际上是特定套件所需要的。如果您担心veryLongInitialization
的代码重复,可以将其移动到单独的函数,并在需要时多次调用。
describe('Base test suite', function () {
// for multiple time usage
var veryLongInitialization = function (done) {
done();
};
describe('first', function () {
beforeAll(function (done) {
veryLongInitialization(done);
});
// ...
});
describe('second', function () {
beforeAll(function (done) {
veryLongInitialization(done);
});
beforeEach(function (done) {
secondVeryLongInitialization(done);
});
// ...
});
describe('third', function () {
beforeAll(function (done) {
veryLongInitialization(done);
});
beforeEach(function (done) {
thirdVeryLongInitialization(done);
});
// ...
});
});