我最近开始写测试,但是我没有太多经验。如果有任何社区成员可以向我指出正确的方向,我将非常感激。我的情况很简单,我已经完成了一半,但无法解决我的确切问题。下面是我的代码。
return generateServiceToken(req.body.appId, req.body.token, req.auth.userId)
.then(result => {
someService
.createCredentialsForUser(
req.auth.userId,
result.user.uid,
result.user.token
)
.then(result => {
return res.status(201).send(result);
});
})
.catch(error => {
return res.status(500).send({ error: `Credentials not valid - ${error}` });
});
generateToken函数负责调用第三方api,以为其平台生成一些凭证并向我们返回创建凭证。
function generateServiceToken(appId: String, token: String, userId: String) {
return new Promise ((resolve, reject)=>{
const apiURL = `https://someapi.com/api/api.php?op=useradd&token=${token}&addr=${userId}&appid=${appId}`;
request.post(apiURL, (error, response, body) => {
const resp = JSON.parse(body);
if (resp.error) return reject(resp.error);
return resolve(resp);
});
});
}
然而,someService.createCredentialsForUser函数负责将这些凭据保存在数据库中,并以简单的json格式返回结果。
我只是在为快乐路径编写测试用例时停留在someService.createCredentialsForUser函数上
我的测试用例在下面。
describe.only("controllers/v3/some/", () => {
const c = {};
before(() => {
c.sandbox = sinon.createSandbox();
c.someServiceStub = c.sandbox
.stub(someService, "createCredentialsForUser")
.resolves(VALID_OUTPUT);
});
describe("when the request is valid", () => {
before(() => {
c.agent = setupApp(authenticationMiddleware(USER_ID));
return test(c, VALID_REQUEST_BODY);
});
it("should return 201", () => {
expect(c.response.statusCode).to.equal(201);
});
it("should call createCredentialsForUser", () => {
expect(c.stubs.createCredentialsForUser.called).to.equal(true);
});
});
});
TestCase函数如下。
function testCase(context, body = VALID_REQUEST_BODY) {
context.sandbox.resetHistory();
console.log(body.length);
const c = context;
return context.agent
.put(`/v3/some/`)
.send(body)
.then(r => {
c.response = r;
});
//.catch(err=>{c.response=err});
}
我的someService.createCredentialsForUser函数负责将数据保存到数据库中,我想对它进行存根处理,这种方式我希望可以从generateServiceToken返回响应
我尝试了以下几种方法。
首先,我尝试在before()中存根该函数,但是如果出现
,它不会失败 error : IllegalArgumentError: init() must be called prior to use.
第二,我尝试了
c.response = c.sandbox.stub(someService, 'createCredentialsForUser').returns(Promise.resolve(r));
在我的测试函数中,以已解决的promise值存根,但在这种情况下没有运气,它会失败,并出现与上述相同的错误。