Javascript 茉莉花测试方法里面。做了还是。然后
想知道是否有人可以帮助我-我正在尝试使用Jasmine(1.3)测试我的js,但我不知道测试.then或.done方法中的任何方法调用的最佳方法 要解释的示例代码:Javascript 茉莉花测试方法里面。做了还是。然后,javascript,testing,jasmine,Javascript,Testing,Jasmine,想知道是否有人可以帮助我-我正在尝试使用Jasmine(1.3)测试我的js,但我不知道测试.then或.done方法中的任何方法调用的最佳方法 要解释的示例代码: Backbone.View.extend({ myMethod: function () { this.something.done(function () { this.doSomethingElse(); }.bind(this)); } }) 我想写一个测试来检查是否调用了this.doSom
Backbone.View.extend({
myMethod: function () {
this.something.done(function () {
this.doSomethingElse();
}.bind(this));
}
})
我想写一个测试来检查是否调用了this.doSomethingElse
我四处查看了jasmine.async和waitsFor/runs设置,但我不确定它如何适合外部代码,也就是说,我不会在实际代码中调用done(),以使测试正常工作。另外,如果我在这个上模拟done方法,那么我就不再测试实际的实现了,对吗
我只是想知道事物是如何结合在一起的。如果有人能给我指出正确的方向,我将非常感激
更新:根据下面的反馈,我现在尝试了以下方法
嘿,谢谢你的回答-我想也许我没有正确的最后一部分-我尝试了两种不同的方法,都是最初通过,但在一两秒钟后失败
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();
});
});
在这两种情况下,测试最初都会通过,但在一秒钟或两秒钟后超时到失败
it('calls doSomethingElse on done',function () {
var mockDeferred = $.Deferred();
myView.something = mockDeferred;
spyOn(myView,'doSomethingElse');
mockDeferred.resolve();
waitsFor(function () {
expect(myView.doSomethingElse).toHaveBeenCalled();
});
});
我遗漏了什么吗?要测试您描述的示例函数,我将在您的测试中执行以下操作:
- 创建一个新的延迟对象(我称之为
)mockDeferred
- 将
传递到您的测试代码中,这样它现在就是mockDeferred
这个了
- 监视
功能doSomethingElse
- 调用
myMethod()
- 在
mockDeferred
- 断言调用了
doSomethingElse
myView.myMethod()
;一定要这样做。我突然提出了一个你可以参考的例子
顺便说一句,我很惊讶你最初尝试的第二个例子。可能是因为在
runs()块之外有一些代码?相关问题
监视中的某个方法,然后
并期望被调用
失败
解决方案:
在fakeAsync
内部运行测试,并在expect
服务:
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();
}));
谢谢你的评论,我更新了上面的问题,告诉你我是如何尝试你的方法的。两种方法都会在超时后失败,因此如果您有任何反馈,我将非常感谢!对于迟来的回复,很抱歉,请查看我的更新答案,如果有帮助,请告诉我!