是否可以同步提升SailsJS应用程序?

时间:2014-03-23 16:08:47

标签: sails.js

测试 会很方便。

避免样板 必须在每个规格上解除应用。

我目前的代码:

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 ,因为这是一个昂贵的任务,我想要我的集成规范尽可能以快速运行。另外,我想避免在每个规格文件上调用Sails lift 的样板。

3 个答案:

答案 0 :(得分:1)

不,sails.loadsails.lift都是异步的。您在测试中做的正确(只需确保在sails.lower方法中调用afterEach)。请查看current Sails integration tests以获取我们如何操作的示例。另请注意,在每次单独测试之前,您可能不需要liftlower - 在某些情况下,在套件运行之前只需抬起一次并将该实例用于所有测试。在这种情况下,您可以使用beforeafter代替beforeEachafterEach

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

现在,您可以全局使用sailsapp

在你的测试中,你可以这样写:

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