假设我有一个执行此操作的功能:
var createDeferredAction = function (args) {
var deferral = $q.defer();
var action = {
args: args
deferral: deferral;
};
$scope.$emit('load-module', action);
return deferral.promise;
}
然后在我的测试中,我希望如此:
myService.createDeferredAction({foo: 'bar'});
var expected = {
args: {foo: 'bar'},
deferral: jasmine.anySimilar($q.defer())
}
expect($scopeSpy.$emit).toHaveBeenCalledWith('load-module', expected);
也就是说,当jasmine检查expected
对象时,我不想让它尝试寻找推送的确切实例,我只是想让它检查一个匹配签名的对象是传入。例如延期的任何实例。
我知道我可以模仿$q.defer()
并返回一个我可以在期望中使用的已知值,但我不必模仿$q.defer()
。
Jasmine可以做到这一点吗?
答案 0 :(得分:0)
我还没有对它进行过测试,但我认为你可以通过从方法调用获取参数然后检查你感兴趣的属性的类型来实现这一点。所以使用Jasmine 2就像:
expect($scopeSpy.$emit.calls.argsFor(1).deferral).toEqual(jasmine.any(Deferred));
或使用Jasmine 1.3
expect($scopeSpy.$emit.calls[0].args[1].deferral).toEqual(jasmine.any(Deferred));