我应该如何对依赖于先前功能结果的功能进行存根处理?

时间:2018-12-16 05:31:05

标签: node.js mocha tdd sinon chai

我最近开始写测试,但是我没有太多经验。如果有任何社区成员可以向我指出正确的方向,我将非常感激。我的情况很简单,我已经完成了一半,但无法解决我的确切问题。下面是我的代码。

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值存根,但在这种情况下没有运气,它会失败,并出现与上述相同的错误。

0 个答案:

没有答案