2011-02-07 4 views
3

私はjQueryとたくさんのajaxリクエスト(json形式)でWebサイトを構築しました。
サーバー側でリクエストを確認するために、単体テストを行いたいと思います。名前を変更 -
=>可能かもしれないユーザーを作成 - :
私はjQueryのを使用するように、私はqUnitを使用しますが、私はテストの順序の問題を抱えている...コントロールQUnitテスト注文

は例えば、私はこれをテストしたかったです有効な名前を持つユーザーは、=>は可能かもしれない
- =>が可能であることができなかった使用した名前を持つユーザーの名前を変更
- ユーザーを削除=>可能かもしれない

マイコード:

$("button#test").button().click(function() { 
    module("Module Users"); 
    newName = 'newUserName'; 
    userId = 0; 

    test("1 Add a user", function() { 
     stop(); 
     $.getJSON(Request,{'action':'add','table':'users'} 
     ,function(data) { 
      equal(data.status,"OK", "Answer is OK"); 
      notEqual(data.item,null, "item is return"); 
      userId = data.item.id; 
      start(); 
     }); 
    }); 

    test("2 Rename user", function() { 
     stop(); 
     $.getJSON(Request,{'action':'modify','table':'users','id':userId,'field':'name','value':newName} 
     ,function(data) { 
      equal(data.status,"OK", "Answer is OK"); 
      equal(data.value,newName, "Return value is OK"); 
      start(); 
     }); 
    }); 

    test("3 Rename user with use name", function() { 
     stop(); 
     badName = 'usedName'; // assert that a user with this name exists 
     $.getJSON(Request,{'action':'modify','table':'users','id':userId,'field':'name','value':badName} 
     ,function(data) { 
      equal(data.status,"Fail", "Answer is Fail"); 
      equal(data.value,newName, "Return value is previous name"); 
      start(); 
     }); 
    }); 

    test("4 Remove the user", function() { 
     stop(); 
     $.getJSON(Request,{'action':'remove','table':'users','id':userId} 
     ,function(data) { 
      equal(data.status,"OK", "Answer is OK"); 
      start(); 
     }); 
    }); 

しかし、問題は、1つのテストが実行されていることで、その後4と2と3 ... は(その後、私は問題は私のテストは独立していないということだと思う)、解決することができる方法

この ?
私は4つのテストすべてを1でカスケードすることができますが、読みにくいと思います...

あなたはどう思いますか?

+5

ユニットテストは、独立しており、互いに独立していると想定されています。単体テスト・フレームワークが任意の順序でテストを実行することは非常に典型的です。なぜなら、独立したテストは読みやすく、保守が簡単で、テストのためにはより良い仕事をするからです。 – kelloti

+0

次に、シナリオテストのためのjQueryフレームワークがありますか? –

答えて

-4

kellotiが言うように、qUnitは、ユニットテストのためのものであり、「ユニットテストが独立し、互いに分離することになっている」... を持っています除去する。

+0

他の人の回答が答えであれば、答えとしてマークする必要があります。 – Jacob

+0

kellotiさんはこの質問には回答していません。ただ質問にコメントしてください!私はそのコメントをupvote持っているとジョーンの答えは良いではありません! –

+1

-1統合テストにも価値があり、しばしば特定の順序で実行する必要があります。 QUnitが統合テストの仕事に間違ったツールであるとか、統合に対する基本的なアプローチに欠陥があるとすれば、実行可能な選択肢を提供してください。 –

1

あなたの例の主な問題は、テストがclickイベントハンドラ内で実行されることです。それをリファクタリングして、トップレベルで(clickイベントとは無関係に)test()の呼び出しを行う必要があります。あなたのテストはajaxy機能のみをテストするので、ボタンをまったく使用する必要はありません。したがって、このような何か:それから私はテストの前に要素を追加する

test("1 Add a user", function() { 
    stop(); 
    $.getJSON(Request,{'action':'add','table':'users'} 
    ,function(data) { 
     equal(data.status,"OK", "Answer is OK"); 
     notEqual(data.item,null, "item is return"); 
     userId = data.item.id; 
     start(); 
    }); 
}); 

test("2 Rename user", function() { 
    stop(); 
    $.getJSON(Request,{'action':'modify','table':'users','id':userId,'field':'name','value':newName} 
    ,function(data) { 
     equal(data.status,"OK", "Answer is OK"); 
     equal(data.value,newName, "Return value is OK"); 
     start(); 
    }); 
}); 

test("3 Rename user with use name", function() { 
    stop(); 
    badName = 'usedName'; // assert that a user with this name exists 
    $.getJSON(Request,{'action':'modify','table':'users','id':userId,'field':'name','value':badName} 
    ,function(data) { 
     equal(data.status,"Fail", "Answer is Fail"); 
     equal(data.value,newName, "Return value is previous name"); 
     start(); 
    }); 
}); 

test("4 Remove the user", function() { 
    stop(); 
    $.getJSON(Request,{'action':'remove','table':'users','id':userId} 
    ,function(data) { 
     equal(data.status,"OK", "Answer is OK"); 
     start(); 
    }); 
}); 
+0

いいえ、問題はqUnitが単体テスト用であり、単体テストが独立している必要があるためです... –

8

場合によっては、ジョブを完了させたい場合もあります。 必要がある場合は試してください。

QUnit.config.reorder = false;

+0

ありがとうございます。ほとんどのテストでは独立したものにしたいと思っていますが、この簡単な設定を使用して統合テストを作成、変更、削除する場合は大変です! :) – John

関連する問題