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