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(),你必须模拟它。有两种方法。第一种方法可以通过监视而无需更改代码,这将在您的示例中起作用,因为您只使用一次,如果更频繁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 函数来获取表单,而是将表单作为参数注入到您的函数中。现在您可以将 mock 传递给您的函数而不是 mocking 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 回答