javascript - 如何测试 Javascript 是否提交了表单?

标签 javascript jquery jasmine

我正在尝试使用 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();
    }
}

最佳答案

要测试 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 函数来获取表单,而是将表单作为参数注入(inject)到您的函数中。现在您可以将模拟传递到您的函数中,而不是模拟 document.getElementById。此模式也称为 Dependency Injection

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();
})

关于javascript - 如何测试 Javascript 是否提交了表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14481509/

相关文章:

javascript - HTTP参数污染攻击

javascript - 如何处理 Angular 4 中的窗口滚动事件?

javascript - 获取最近类(class)的id值

javascript - 关于鼠标悬停弹出效果的 Bootstrap 工具提示

node.js - SpecReporter 不是 jasmine 上的构造函数错误

javascript - 如何使用 Chrome DevTools 检查 BroadcastChannel?

javascript - 如何使用 jQuery wrap() 包装动态创建的元素?

jquery - 如何在 jQuery 中缓存变量?

angular - 在 Angular 6 组件 ngOnInit 函数中测试 rxjs 间隔

javascript - 在 watch 破坏测试中使用 Jasmine 形式有效性进行 AngularJS 单元测试