单元测试无效方法-Jasmine,javascript

单元测试无效方法-Jasmine,javascript,javascript,unit-testing,jasmine,titanium-alloy,Javascript,Unit Testing,Jasmine,Titanium Alloy,这是我公开的控制器代码中的函数 //unit test code $.getMessagesUnit = function(chatId) { if (!(Titanium.Network.networkType === Titanium.Network.NETWORK_NONE)) { apiHelper.APIGetRequest(xxxxxxxx + '/messages/' + args.chatId, function(e) {

这是我公开的控制器代码中的函数

//unit test code
    $.getMessagesUnit = function(chatId) {

        if (!(Titanium.Network.networkType === Titanium.Network.NETWORK_NONE)) {

            apiHelper.APIGetRequest(xxxxxxxx + '/messages/' + args.chatId, function(e) {
                $.view_indicator.visible = true;
                var status = this.status;
                if (status == 200) {

                    console.log('get chats');

                    var data = JSON.parse(this.responseText);
                    console.log(data);

                    var rows = [];
                    var i = 0;
                    var blob;

                    for (x in data.messages) {
                        //Ti.API.debug(JSON.stringify(messages[x]));

                        var nickname = null;
                        var chatBlob = null;
                        var picture = null;
                        var timeStampCon = null;

                        chatBlob = data.messages[x].message;
                        nickname = data.messages[x].user.nickname;
                        picture = data.messages[x].user.pictures[0];

                        //alert(data.messages[x].message);

                        timeStampCon = utilities.getCurrentTimeFromStamp(data.messages[x].timestamp);
                        textArea.addLabel(timeStampCon);

                        //alert(data.messages[x].user.id);

                        if (args.pickedId == data.messages[x].user.id) {

                            textArea.recieveMessage(chatBlob);
                            textArea.addLabel("\n");

                        } else {

                            textArea.sendMessage(chatBlob);
                            textArea.addLabel("\n");

                        }

                    }

                    //return rows;
                    //end
                    $.view_indicator.visible = false;

                }


            }, function(err) {

                alert('Unknown error from api');
                $.view_indicator.visible = false;
            });

        } else {
            alert('No internet connection found');
            $.view_indicator.visible = false;
        }

    };

    //end
以下是我的单元测试代码:

it('test chat window function.', function() {
    $ = Alloy.createController('chatWindow', {});
    expect($.getMessagesUnit(123).chatBlob). toBeDefined();
});
我想在api调用后测试JSON请求中的变量是否已定义:

var nickname = null;
var chatBlob = null;
var picture = null;
var timeStampCon = null;
确保定义了我从单元测试中获取的数据。我得到以下错误:

[INFO] :   .  ============================================================
[ERROR] :  .  THERE WERE FAILURES!
[ERROR] :  .  ============================================================
[ERROR] :  .  Recap of failing specs:
[ERROR] :  .  ------------------------------------------------------------
[ERROR] :  .  chatWindow controller test chat window function.. - Expected undefined to be defined.
我对单元测试还很陌生,我怎么能在这样一个无效的方法中测试单个变量呢

干杯,伙计们

更新-使用间谍:

it('test spies in receive message function.', function() {
    $ = Alloy.createController('chatWindow', {});
    spyOn($, 'textarea.recieveMessage');
    $.getMessagesUnit(123);
    expect(textarea.recieveMessage).toHaveBeenCalled();
});

[INFO] :   .   - test spies in receive message function.. (FAILED)
[INFO] :   .   - - Expected spy recieveMessage to have been called.

您无法访问chatBlob,因为它只能在success函数创建的闭包中访问。在调用
$之前,您可以在
textArea
对象上的
receivemessage
函数中添加一个间谍。getMessagesUnit(123)
然后检查间谍是否接收到调用以及该调用的参数,即您的chatBlob值

我该怎么做,干杯。我对茉莉花很陌生,它快把我逼疯了!用间谍代码修改了OP,无法运行。Cheers spyOn函数中的第二个参数需要是您正在监视的函数的名称,因此
spyOn($.textArea,'ReceiveMessage')
是您想要的(假设textArea是$object的一个属性。不起作用,似乎它没有跟踪到async方法。如果我在async方法之外调用该函数,它就会起作用。