2016-08-10 27 views
0

我正在编写一个C++类ScriptProcess,意在用于QML,充当子进程的接口。所述子进程加载脚本,然后按需执行功能。当你调用一个函数时,结果(不管它是一个值还是一个异常)通过信号异步返回。QML:在单元测试中没有调用信号

import QtQuick 2.5 
import QtTest 1.0 
import dungeon 1.0 

TestCase { 
    id: test 
    name: "ScriptProcessTest" 

    property ScriptProcess session: null 

    signal exceptionWhenLoadingCode(string type, int line, string message) 

    SignalSpy { 
     id: exceptionSpy 
     target: test 
     signalName: "exceptionWhenLoadingCode" 
    } 

    Component { 
     id: process 

     ScriptProcess { 
      id: script 

      onExceptionWhenLoadingCode: test.exceptionWhenLoadingCode(type, line, message) 
     } 
    } 

    function startScript(scriptUrl) { 
     var request = new XMLHttpRequest() 
     request.open("GET", "data/%1.js".arg(scriptUrl), false) 
     request.send(null) 

     return process.createObject(test, {code: request.responseText}) 
    } 

    function cleanup() { 
     if (session) { 
      session.stop() 
     } 

     delete session 
     session = null 
    } 

    function test_syntaxErrorInGlobalContextIsReported() { 
     var count = exceptionSpy.count 
     session = startScript("syntax-error-in-global-context") 

     compare(exceptionSpy.count, count + 1) 
    } 

    function test_errorThrownInGlobalContextIsReported() { 
     var count = exceptionSpy.count 
     session = startScript("error-in-global-context") 

     compare(exceptionSpy.count, count + 1) 
    } 
} 

概括地说,我做到以下几点:

  1. 对于每一个测试,打开auxillary过程,并从文件加载脚本。这是通过实例化一个Component,通过ScriptProcess.code属性给出的脚本完成的。
  2. 运行测试。
  3. 测试结束后,终止进程并删除管理它的对象。

我的问题是SignalSpy调用exceptionSpy没有被触发; exceptionSpy.count总是为零,我不知道为什么。 这是为什么?我是否滥用SignalSpyComponent

回答

1

XMLHttpRequest是异步的,所以你应该改变startScript()到类似:

function startScript(scriptUrl) { 
    var object = process.createObject(test) 

    var request = new XMLHttpRequest() 
    request.onreadystatechange = function() { 
     if (request.readyState === XMLHttpRequest.DONE) 
      object.code = request.responseText 
    } 
    request.open("GET", "data/%1.js".arg(scriptUrl), false) 
    request.send(null) 

    return object 
} 

而且由于信号不会马上发出,你必须等待它,而不是比较创建对象后立即计数:

function test_foo() { 
    var count = exceptionSpy.count 
    session = startScript("...") 

    tryCompare(exceptionSpy, "count", count + 1) 
} 
相关问题