3

我已经为起诉 Qunit 的 ajax 编写了单元测试,但是出现了类似的错误

Error: assertion outside test context, was .success@http://test.loc/assets/test/widget-add-or-edit-test.js:227 
b.Callbacks/c@http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js:3 
b.Callbacks/p.fireWith@http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js:3
k@http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js:5 .send/r@http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js:5
Source:     

http://code.jquery.com/qunit/qunit-1.11.0.js:899

我的测试代码是

test( "Widget.updateAxisTypeAjax x", function() {

        stop();

        Widget.updateAxisTypeAjax( {   
                axis   : 'x' ,

                x_id   : 179,
                y_id   : 175
            }  ,{
            success : function( response ){

                ok( true, "updateAxisTypeAjax Success PASS!");
                equal( typeof response , 
                       "object" , 
                       "updateAxisTypeAjax response is json valid object !"
                );

                equal( typeof response == "object" && 
                       ( "average" in response  ) && 
                       ("is_datetime" in response) , 
                        true , 
                       "updateAxisTypeAjax average check PASS !"
                );

            } ,
            complete : function(){
                ok(true, "updateAxisTypeAjax completed PASS!");
                start();
            }
        });

});

并且Widget.updateAxisTypeAjax

Widget.updateAxisTypeAjax = function( data_obj, callbacks ){

        data_obj = jQuery.extend( data_obj ,{
            action : 'update_axis'
        });

        Widget.ajax( 5 )
              .data( data_obj  )
              .callbacks( callbacks )
              .fire();

}

并且Widget.ajax是:

var Widget = Widget || {} ;


function _WidgetAjax( type  ){

        var loader      = $('#series_loader');

        this.ajaxUrl = '/dashboard/charts/ajax/' + ( type || 1 ) ;

        this.ajaxSettings = {

            url: this.ajaxUrl ,
            type:"GET",
            data :{} ,
            complete : function(){ // always
                  loader.hide();
            }
        };

        // show ajax loading
        loader.show();

        this.data = function( data ){

                jQuery.extend( this.ajaxSettings, { data: data }  );
                return this;
        }

        this.callbacks = function( callbacks ){

                jQuery.extend( this.ajaxSettings, callbacks || {}  );

                return this;
        }

        this.success = function( func ){

                if ( jQuery.isFunction( func ) ){
                     jQuery.extend( this.ajaxSettings, { success: func }  );
                }

                return this;
        };

        this.fire = function(){

                return $.ajax( this.ajaxSettings );
        };

};

Widget.ajax = function( type ){ 

        return new _WidgetAjax( type );        
};

请帮我修复这个单元测试错误!

4

1 回答 1

2

您正在测试一个异步函数,因此您需要使用 QUnit 中的异步功能。

而不是test你应该使用asyncTest

这是文档

请注意,您必须告诉 QUnit 在进行异步测试时需要多少断言。

asyncTest( "Widget.updateAxisTypeAjax x", 4, function() {

        stop();

        Widget.updateAxisTypeAjax( {   
                axis   : 'x' ,

                x_id   : 179,
                y_id   : 175
            }  ,{
            success : function( response ){

                ok( true, "updateAxisTypeAjax Success PASS!");
                equal( typeof response , 
                       "object" , 
                       "updateAxisTypeAjax response is json valid object !"
                );

                equal( typeof response == "object" && 
                       ( "average" in response  ) && 
                       ("is_datetime" in response) , 
                        true , 
                       "updateAxisTypeAjax average check PASS !"
                );

            } ,
            complete : function(){
                ok(true, "updateAxisTypeAjax completed PASS!");
                start();
            }
        });

});

应该可以工作。这不应该太难解决!

于 2013-04-10T09:22:54.453 回答