3

Jasmine で JavaScript の一部をテストしようとしています。

Jasmineに関しては初心者であり、Javascriptに関する私の知識はせいぜい基本的なものです. 私がやりたいことは、フォームが送信されたことを確認することです。テストの構文がどのように見えるべきかわかりません。私はspyOnを使用する必要があると思いますが、方法がよくわかりません。誰かが私を正しい方向に向けることができれば幸いです。

function submitform(array) {
    var token = array[0].replace("access_token=", "");
    if ((token !== "")) {
        $('input[name=Token]').val(token);
        var frm = document.getElementById("tokenform");
        frm.submit();
    }
}
4

1 に答える 1

2

呼び出されたことをテストするfrm.submit()には、モックする必要があります。それには2つの方法があります。最初の方法は、をスパイすることでコードを変更せずに機能します。これは、一度しか使用しないため、この例では機能します。より頻繁にdocument.getElementById使用すると難しくなります。document.getElementById

var submit;
beforeEach(){
  // when your code calls document.getElementById it return an object 
  // with just one property where you can spy on that it was called
  submit = jasmine.createSpy();
  spyOn(document 'getElementById').andReturn({submit:submit})
}

it ("should submit", function(){
  submitform([somedata]);
  expect(submit).toHaveBeenCalled();
})

より良い方法は、コードを書き直してテストしやすくすることです。したがって、DOM 関数を呼び出してフォームを取得する代わりに、フォームを引数として関数に挿入します。これで、モックを作成する代わりに、モックを関数に渡すことができますdocument.getElementByIdこのパターンは依存性注入としても知られています

function submitform(array, frm) {
    var token = array[0].replace("access_token=", "");
    if ((token !== "")) {
        $('input[name=Token]').val(token);
        frm.submit();
    }
}

it ("should submit", function(){
  var submit = jasmine.createSpy();
  var form = {submit: submit}
  submitform([somedata],form);
  expect(submit).toHaveBeenCalled();
})
于 2013-01-23T19:46:58.040 に答える