茉莉节点testin子进程回调

时间:2014-02-18 17:07:56

标签: javascript node.js jasmine jasmine-node

我有一个异步函数,如果成功则返回带有状态代码和路径的回调。我想使用jasmine测试我收到的状态代码并将路径分配给所有将来的测试。我一直为我的测试得到一个未定义的值......

function make_valid(cb){
    var vdt = child.spawn('node', base,
        {cwd: ims_working_dir, stdio: ['pipe', 'pipe', 'pipe']},
        function (error, stdout, stderr) {
            if (error !== null) {
                console.log('spawn error: ' + error);
            }
        });
    vdt.stdout.setEncoding('utf8');
    vdt.stdout.on('data', function(data) {});

    vdt.on('close', function(code) {

        if (code === 0) {
            cb(null, '/home/');
        } else {
            cb(null, code);
        }
    });
}

describe("IMS", function(cb) {
    var path;
    jasmine.getEnv().defaultTimeoutInterval = 40000;

    beforeEach(function(done, cb) {
        console.log('Before Each');
        path = make_valid(cb);
        done();
    });

    it("path should not be null", function() {
        expect(path).toBeDefined();
    });
});

这是输出:

Failures:

  1) IMS path should not be null
   Message:
     Expected undefined to be defined.
   Stacktrace:
     Error: Expected undefined to be defined.
    at null.<anonymous> (/home/evang/Dev/dataanalytics/IMS_Tester/spec/ims-spec.js:46:16)
    at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)

Finished in 0.014 seconds

1 test, 1 assertion, 1 failure, 0 skipped

如果我获得了在beforeEach声明中传递的路径,我想在解析文件时编写更多测试。我想我正在处理错误的回调或者我需要使用间谍。让我知道!

1 个答案:

答案 0 :(得分:0)

您正在使用path函数的返回值设置make_valid,但该函数不返回任何内容。

当我使用jasmine时,我只对测试本身(done()函数)的it()回调取得了成功。

在每次测试之前需要异步功能时,我使用了runs()waitsFor()函数。

尝试这样的代码(根据你的例子修改):

var code = null;
beforeEach( function() {
  // get a token so we can do test cases. async so use jasmine's async support
  runs( function() {
    make_valid( function( error, returnCode ) {
      if( error ) code = "ERROR_CODE";
      else code = returnCode;
    } );
  } );

  waitsFor( function() {
    return code !== null;
  } );

  runs( function() {
    expect( code ).toBeDefined();
  } );
} );

afterEach( function() {
  code = null;
} );

修改: 根据我们的评论,适用于其他测试的一次性异步测试的建议方法是sample-spec.js。如果外部it()不使用done(),则内部测试将无法通过。

/*jslint node: true */
"use strict";

describe( "The full, outer test", function() {

  var code = null;
  it( "should setup for each inner test", function(done) {
    make_valid( function( error, returnCode ) {
      expect( returnCode ).toBeDefined();
      code = returnCode;
      done();
    } );
  } );

  describe( "The inner tests", function() {
    it( "inner test1", function() {
      expect( code ).not.toBeNull();
    } );
    it( "inner test2", function() {
      expect( code ).toBe(200);
    } );
  } );
} );

function make_valid( callback ) {
  setTimeout( function(){ callback( null, 200 ); }, 500 );
}