Как я должен заглушить функцию, которая зависит от результата предыдущей функции? - PullRequest
0 голосов
/ 16 декабря 2018

Я недавно начал писать тесты, и у меня нет большого опыта. Если бы кто-то из членов сообщества мог указать мне верное направление, я был бы очень благодарен.Мой сценарий прост, я на полпути к нему, но не могу точно решить свою проблему.Ниже приведен мой код ..

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 при написании тестового примера для happy-path

Мой тестовый пример показан ниже.

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

Я пробовал пары способов, которые выглядят следующим образом ..

Сначала я пытался заглушить эту функцию перед() но не повезло, что это не с

 error : IllegalArgumentError: init() must be called prior to use.

Во-вторых, я попытался

 c.response = c.sandbox.stub(someService, 'createCredentialsForUser').returns(Promise.resolve(r));

в моей тестовой функции заглушить со значением разрешенного обещания, но не повезло, в этом случае она завершается с той же ошибкой, что и выше.

...