.done 或 .then 中的茉莉花测试方法
Jasmine testing methods inside .done or .then
想知道是否有人可以帮助我 - 我正在尝试使用 Jasmine (1.3) 测试我的 js,但我无法找出测试任何方法调用的最佳方法在 .then 或 .done 方法中。
示例代码说明:
Backbone.View.extend({
myMethod: function () {
this.something.done(function () {
this.doSomethingElse();
}.bind(this));
}
})
我想写一个测试来检查这个.doSomethingElse是否被调用。
我正在环顾 jasmine.async 和 waitsFor/run 设置,但我不确定它如何适应外部代码,即我不会在实际代码中调用 done() 来让我的测试正常工作。另外,如果我在此模拟完成方法,那么我不再测试实际实现,对吧?
我只是想念事情是如何组合在一起的。如果有人能指出我正确的方向,我将不胜感激!
更新:根据下面的反馈,我现在已经尝试了以下方法
嘿,感谢您的回答 - 我想也许我没有正确的最后一部分 - 尝试了 2 种不同的方法,都是初始通过,但在一秒或 2 秒后失败。
it('calls doSomethingElse on done',function () {
var mockDeferred = $.Deferred();
myView.something = mockDeferred;
spyOn(myView,'doSomethingElse');
mockDeferred.resolve();
waitsFor(function () {
expect(myView.doSomethingElse).toHaveBeenCalled();
});
});
还有:
it('calls doSomethingElse on done',function () {
var mockDeferred = $.Deferred(),
someTrigger = false;
myView.something = mockDeferred;
spyOn(myView,'doSomethingElse');
runs(function () {
mockDeferred.resolve();
someTrigger = true;
});
waitsFor(function () {
someTrigger = true;
});
runs(function () {
expect(myView.doSomethingElse).toHaveBeenCalled();
});
});
在这两种情况下,测试最初都会通过,但在一秒钟或 2 秒后超时失败。
我错过了什么吗?
为了测试您描述的示例函数,我会在您的测试中执行以下操作:
- 创建一个新的延迟对象(我称之为
mockDeferred
) - 将
mockDeferred
传递到待测试的代码中,以便它现在this.something
在您的示例中 - 监视
doSomethingElse
功能 - 呼叫
myMethod()
- 拨打
resolve()
mockDeferred
- 断言
doSomethingElse
被称为
根据OP的更新进行编辑:
在你的两个例子中,我没有看到你在测试中调用myView.myMethod()
的任何地方;确保你这样做。我举了一个例子,你可以在这里参考。
顺便说一句,我很惊讶你最初尝试的第二个例子。也许是因为您在runs()
块之外有一些代码?
相关问题
监视
.then
内部的方法并预期.toHaveBeenCalled
失败
解决方案:
在
fakeAsync
内运行测试,并在expect
之前运行tick()
服务:
getFirebaseDoc() {
this.db.firestore.doc('some-doc').get()
.then(this.getFirebaseDocThen)
.catch(this.getFirebaseDocCatch);
}
单元测试:
it('should call getFirebaseDocThen', fakeAsync(() => { // note `fakeAsync`
spyOn(service, 'getFirebaseDocThen');
spyOn(service.db.firestore, 'doc').and.returnValue({
get: (): any => {
return new Promise((resolve: any, reject: any): any => {
return resolve({ exists: true });
});
},
});
service.getFirebaseDoc();
tick(); // note `tick()`
expect(service.getFirebaseDocThen).toHaveBeenCalled();
}));
相关文章:
- 使用茉莉花测试木偶视图和车把模板
- 使用茉莉花测试主干关系模型
- Sinon-带有回调的存根函数-导致测试方法超时
- AngularJS列出了所有单元测试方法
- 茉莉花测试显示模块未定义
- 无法在茉莉花测试中调用$scope.form.$submitted:未定义
- 运行茉莉花测试时,我怎么知道我是否在描述块中,之前每个块或它块
- 期望使用量角器和茉莉花测试 URL #fragment
- 茉莉花测试$log装饰器
- .done 或 .then 中的茉莉花测试方法
- 无法让茉莉花测试成功调用注入的服务
- 茉莉花测试敲除可观察数组
- 骨干,木偶,咕噜咕噜,茉莉花测试
- 为什么这个茉莉花测试在 Firefox 中偶尔会失败
- 用茉莉花测试一个角度的承诺
- 如何防止角拦截器在茉莉花测试期间拾取$httpBackend响应
- 如何在 JavaScript 中测试方法而不会出错
- 渲染流星模板时执行的茉莉花测试方法
- 用茉莉花测试测试ng变化
- 茉莉花测试:对象没有't支持属性或方法