我有一个具有以下功能的数据服务
function getInsureds(searchCriteria) {
var deferred = $q.defer();
insuredsSearch.get(searchCriteria,
function (insureds) {
deferred.resolve(insureds);
},
function (response) {
deferred.reject(response);
});
return deferred.promise;
}
我想测试以下功能:
function search ()
{
dataService
.getInsureds(vm.searchCriteria)
.then(function (response) {
vm.searchCompleted = true;
if (response.insureds.length > 100) {
vm.searchResults = response.insureds.slice(0, 99);
} else {
vm.searchResults = response.insureds;
}
});
}
我如何保留承诺,以便在我调用getInsureds时它会解析承诺并立即返回结果。我开始是这样的(茉莉花测试),但是我被卡住了,因为我不知道如何解决这个承诺并传递所需的参数。
it("search returns over 100 results searchResults should contain only 100 records ", function () {
var results103 = new Array();
for (var i = 0; i < 103; i++) {
results103.push(i);
}
var fakeSearchForm = { $valid: true };
var isSearchValidStub = sinon.stub(sut, "isSearchCriteriaValid").returns(true);
var deferred = $q.defer();
var promise = deferred.promise;
var dsStub = sinon.stub(inSearchDataSvc, "getInsureds").returns(promise);
var resolveStub = sinon.stub(deferred, "resolve");
//how do i call resolve and pass in results103
sut.performSearch(fakeSearchForm);
sinon.assert.calledOnce(isSearchValidStub);
sinon.assert.calledOnce(dsStub);
sinon.assert.called(resolveStub);
expect(sut.searchResults.length).toBe(100);
});
答案 0 :(得分:43)
在当前的sinon版本v2.3.1中,您可以使用stub.resolves(value)
和stub.rejects(value)
函数
例如,您可以使用以下代码
来存储myClass.myFunctionsinon.stub(myClass, 'myFunction').resolves('the value you want to return');
或
sinon.stub(myClass, 'myFunction').rejects('the error information you want to return');
答案 1 :(得分:21)
您必须在调用搜索功能之前解决该承诺。这样,您的存根将返回已解决的承诺,并立即调用then
。而不是
var resolveStub = sinon.stub(deferred, "resolve");
您将使用虚假回复数据解决延期
deferred.resolve({insureds: results103})
答案 2 :(得分:7)
我有类似的情况,接受的答案和评论不起作用,但与this question一起帮助我以下列方式解决了这个问题。我希望它对某人有帮助。
var Promise = require('bluebird');
var deferred = Promise.defer();
stub = sinon.stub(deferred, 'resolve').returns(deferred.promise);
deferred.resolve({data: data});
// or
deferred.reject(new Error('fake error'));
答案 3 :(得分:5)
您还可以执行以下操作:
import sinon from 'sinon';
const sandbox = sinon.sandbox.create();
const promiseResolved = () => sandbox.stub().returns(Promise.resolve('resolved'));
const promiseRejected = () => sandbox.stub().returns(Promise.reject('rejected'));
const x = (promise) => {
return promise()
.then((result) => console.log('result', result))
.catch((error) => console.log('error', error))
}
x(promiseResolved); // resolved
x(promiseRejected); // rejected
答案 4 :(得分:1)
我发现了另外一种选择。比其他方法痛苦得多。
您可以使用此npm包:sinon-stub-promise。
它抽象了大部分细节,因此你不必再发明轮子。在努力模拟一个很长的承诺之后帮助我写了我的测试。
希望它有所帮助!