1

我有一个异步函数,如果成功,它会返回一个带有状态代码和路径的回调。我想使用 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 声明中传递的路径,我想在解析文件的地方编写更多测试。我认为我正在错误地处理回调,或者我可能需要使用间谍。让我知道!

4

1 回答 1

0

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

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

在每次测试之前需要一个异步函数时,我使用了它们的runs()andwaitsFor()函数。

尝试一些这样的代码(针对您的示例进行了修改):

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

编辑:根据我们的评论,适用于其他测试的一次性异步测试的建议方法是 this sample-spec.jsit()如果外部不使用,内部测试将不会通过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 );
}
于 2014-02-18T17:58:33.930 回答