测试 会很方便。
避免样板 必须在每个规格上解除应用。
我目前的代码:
beforeEach(function(done) {
Sails.lift({ log: { level: 'error' } }, function(err, sails) {
app = sails.express.app
// beforeEach related stuff
done()
})
}
我想穿上specs_global.js
:
app = Sails.lift({ log: { level: 'error' } }).express.app
编辑:
问题是,我只想所有我的规范实例化Sails ,因为这是一个昂贵的任务,我想要我的集成规范尽可能以快速运行。另外,我想避免在每个规格文件上调用Sails lift 的样板。
答案 0 :(得分:1)
不,sails.load
和sails.lift
都是异步的。您在测试中做的正确(只需确保在sails.lower
方法中调用afterEach
)。请查看current Sails integration tests以获取我们如何操作的示例。另请注意,在每次单独测试之前,您可能不需要lift
和lower
- 在某些情况下,在套件运行之前只需抬起一次并将该实例用于所有测试。在这种情况下,您可以使用before
和after
代替beforeEach
和afterEach
。
答案 1 :(得分:1)
将此代码段放在specs_global.js
:
global.liftSails = function (cb) {
// lift sails no more than once
if (!global.app) {
Sails.lift({ log: { level: 'error' } }, function(err, sails) {
global.sails = sails;
global.app = sails.express.app;
cb();
});
} else {
cb();
}
}
现在,您可以全局使用sails
和app
。
在你的测试中,你可以这样写:
beforeEach(function(done) {
liftSails(function () {
// do something with sails and app here
done();
})
});
答案 2 :(得分:1)
Edy的回答解决了我遇到的问题,但由于我目前喜欢使用promises而且我认为它们非常适合避免样板,这里是我使用promises的解决方案
由于我在我的代码和规范上使用了promises(q模块),我利用了它。我做了什么:
globals.js
文件在globals.js
上声明一个全局变量承诺Sails将解除。
global.sails_lift_promise = liftSails()
function liftSails() {
return Q.ninvoke(Sails, 'lift', { log: { level: 'error' } })
.then(function(_sails) {
global.sails = _sails
global.app = _sails.express.app
})
}
此sails_lift_promise
承诺只会将Sails 提升一次,并且可以通过所有规范获得,因此我们可以使用它:
//on some_spec1.js
beforeEach(function(done) {
sails_lift_promise.then(doSomething).done(done)
})
//on some_spec2.js
beforeEach(function(done) {
sails_lift_promise.then(doAnotherThing).done(done)
})