2014-04-14 6 views
7

실제로 QML component which embeds C++ objects에 대한 테스트를 실행하려고합니다. 불행히도 테스트를 실행할 때 약간의 오류가 발생합니다. C++ 객체는 QML 파일에서 인식되지 않습니다. C++ 객체가 main.cpp 파일에 설정되어 있기 때문에이 점도 이해할 수 있습니다.QML 구성 요소 모의 방법

내 질문은 : QML 테스트를 수행하기 위해 컨텍스트 속성을 어떻게 조롱 할 수 있습니까? 또는 다른 말로하면 Qt/QML 코드를 혼합하여 단위 테스트를 수행 할 수 있습니까?

+0

테스트를 어떻게 실행합니까? QML로 단위 테스트를 작성하고 테스트를 실행하기 위해 _qmltestrunner_를 사용하려고합니까? C++에서 QML을 실행하고 _googlemock_에서 테스트를 실행하려고합니까? 아니면 뭔가하고 있는거야? – dobey

+0

혹시이 문제가 해결 되었습니까? 나는 같은 문제를 가지고있다. –

+0

나는 일한 것을 알아 냈고 아래 답변으로 추가했습니다. 불행히도, 저의 원래 부르짖 음은 도움을 청했습니다. 그래서 누군가가 다른 모습을보고 편집 된 사진을 다시 볼 수 있기를 바랍니다. –

답변

0

내가 이해하는 한, 나도 같은 문제가있어. 얼마 전이 모의를 써 봤어 : https://bitbucket.org/troyane/qml-cpp-template (목적을 위해 무료로 사용할 수있다).

이 당신이 일을하는 두 가지 방법을 볼 수 main.cpp에서보세요 :

// 1 case: 
// Register type and create object at QML side 
qmlRegisterType<CppClass>("CppClassModule", 1, 0, "CppClass"); 
QQmlApplicationEngine engine(QUrl("qrc:///qml/main.qml")); 
qDebug() << "Qt version: " << qVersion(); 
// 2 case: 
// Create object here and "move it up" to QML side 
// engine.rootContext()->setContextProperty("cppClass", new CppClass); 

행운을 빕니다!

-1

모든 C++ 코드로 컴파일하지 않고 QML 테스트가 작동됩니다. 내 경우

, 나는 C는 또 다른 목적은 left_motor라는 속성과 컨트롤러 객체 ++, 그리고 그 속성 속도 있습니다.

속도은 읽을 수 있지만 쓰기가 불가능합니다. 모든 업데이트는 슬롯을 통해 발생합니다. QML에서 다음과 같이 보입니다. controller.left_motor.onGuiSpeedChanged (speed)

항목 구성 요소, 속성 및 일부 자바 스크립트를 사용하여 QML로 조롱 할 수있었습니다.

Item {      // mock of controller 
    id: controller 
    property alias left_motor: left_motor 
    Item { 
     id: left_motor 
     property int speed: 0 
     function onGuiSpeedChanged(arg) { 
      speed = arg 
     } 
    } 
} 
property alias controller: controller 

지금 controller.left_motor.onGuiSpeedChanged (속도) 전에 같이 해결하지만, 모의 함수에 연결 호출합니다. 나는 전화가 일어났다는 것을 알기 위해 speed 속성을 다시 읽을 수있다. 대신 쓰기 가능한 속성의 슬롯을 사용하는 것이 중요하다는

function test_set_speed() { 
    console.log("controller.left_motor.speed: " + controller.left_motor.speed) 
    var got = page1.set_left_speed(250) 
    compare(got, 250, "set_left_speed() return incorrect") 
    console.log("controller.left_motor.speed: " + controller.left_motor.speed) 
} 

참고 :

여기 내 테스트 기능 (I 테스트 해요 코드가 PAGE1의 일부)입니다. 슬롯에 대한 호출은 함수 호출과 비슷하게 조롱 될 수 있습니다. 나는 재산 쓰기를 조롱하는 방법을 이해할 수 없었다.

필자는 writable 속성을 사용하기 시작했는데, 이것이 C++ 및 QML 바인딩의 문서에서 처음 이었기 때문입니다. 예상대로 QML과 C++를 연결하지만 테스트를 위해 조롱받을 수는 없습니다.

+0

이 공간은 답변을위한 공간입니다.이 공간은이 공간과 비슷한 공간을 만들거나 새로운 질문을 만들 수 있습니다. – eyllanesc

+0

원래 요청한 내용이 잘못되었지만 답변을 찾아 수정했습니다. 나는 여기에 최선의 행동을 확신하지 못한다 : 새로운 대답을 올리거나 죽은 것을 남겨 두거나 나쁜 것을 편집한다 (그리고 부정적인 점수를 가짐). 나는 후자를했지만, 환영합니다. –

관련 문제