javascript - Jasmine + 测试外部依赖

标签 javascript unit-testing jasmine

我想知道使用 jasmine 测试外部依赖项的最佳方法。

例如,我有一个纯粹显示和隐藏背景蒙版的覆盖模块:

function Overlay () {

}

Overlay.prototype.show = function () {

}

Overlay.prototype.hide = function () {

}

这已设置完整的 Jasmine 单元测试。

然后我有另一个使用覆盖模块的模块对话框:

function Dialog () {

}

Dialog.prototype.show() {
 //do dialog stuff here, then show overlay
 var overlay = new Overlay();
 overlay.show();
}

我有 Jasmine 测试来测试除覆盖之外的所有对话框。假设覆盖单元测试已设置并通过,对话框测试是否只需要确保定义了 var overlay 并调用了它的 show 方法?

对于关注点分离来说,这是最好的方法吗?

提前致谢

最佳答案

最好的方法是将叠加层的实例注入(inject)到对话框的构造函数中。

function Dialog (overlay) {
  this.overlay = overlay:
}

Dialog.prototype.show() {
 this.overlay.show();
}

在您的测试中,您可以简单地注入(inject)一个 spy 。

var overlay = {show: jasmine.createSpy()};
var dialog = new Dialog(overlay);
dialog.show();
expect(overlay.show). toHaveBeenCalled();

另一种方法是监视全局 Overlay 函数,并通过监视 show 函数返回一个对象。

var overlay = {show: jasmine.createSpy()};
jasmine.spyOn(Overlay, 'show').andReturn(overlay);
var dialog = new Dialog(overlay);
dialog.show();
expect(overlay.show). toHaveBeenCalled();

关于javascript - Jasmine + 测试外部依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15173577/

相关文章:

javascript - 使用 Jasmine 测试 ajax 请求内的 Angular 范围变量

javascript - 你如何像 JSFiddle 那样在一个窗口中获得多个 View

angular - 在 Angular TestBed 中模拟 Firestore 集合

unit-testing - 使用最小起订量模拟虚拟只读属性

c# - 如何使用 Get() 和 Set() 方法最小化一个类

Angular 单元测试异步与同步问题

angularjs - Angular jqLit​​e : . find() 不起作用 - 不选择标签

javascript - 尝试在按钮单击时打开模式

javascript - for 循环中的 jQuery .append()

javascript - 查找最近的 span 元素并更改 CSS 类