Loopback 4: тестирование проблем с Sinon и инъекциями - PullRequest
1 голос
/ 12 октября 2019

Мы пытаемся сделать тест с обратной связью. Тест предполагает вызов Google API, и мы хотим издеваться над ним с помощью Sinon.

Контроллер:

[...]

В конструкторе:

  @inject('services.OAuth2Service')
    private oauth2Service: OAuth2Service

[...]

В конечной точке:

@post('/user-accounts/authenticate/oauth2', {
async authenticateOauth2(
    @requestBody() oauthRequest: OAuthId,
    @inject(RestBindings.Http.REQUEST) _req: Request,
  ): Promise<AccessToken> {
    const email = await this.oauth2Service.getOAuth2User(oauthRequest); // The method to mock.
  ....
}

Тест:

it('oauth2 authentication with google', async () => {

 //Create a spy for the getOAuth2User function
    inject.getter('services.OAuth2Service');
    var oauth2Service: OAuth2Service;

    var setOauthSpy = sinon.spy(oauth2Service, "getOAuth2User"); // Error: Variable 'oauth2Service' is used before being assigned

    const res = await client
      .post('/user-accounts/authenticate/oauth2')
      .set('urlTenant', TEST_TENANT_URL1A)
      .set('userType', TEST_USERTYPE1)
      .send({
        code: TEST_GOOGLE_AUTH2_CODE_KO,
        providerId: TEST_GOOGLE_PROVIDER,
        redirectUri: TEST_GOOGLE_REDIRECT_URI,
      })
      .expect(401);
    expect(res.body.error.message).to.equal('The credentials are not correct.');

    setOauthSpy.restore();

  });

Как мы можем проверить этот метод? Как мы можем проверить конечную точку, которая включает инъекцию в конструктор в loopback? Пожалуйста, нам нужна помощь.

1 Ответ

0 голосов
/ 15 октября 2019

Я вижу два варианта:

  1. Перед запуском теста создайте контекст обратной петли , привяжите заглушку к "services.OAuth2Service" и используйте этот контекст для созданияконтроллер, который вы хотите проверить.

  2. значение по умолчанию (вероятно, не то, что вы хотите)

В том месте, где вы используете @inject, выукажите значение по умолчанию (и, возможно, указывает, что зависимость необязательна ), например, так:

@inject('services.OAuth2Service', { optional: true })
    private oauth2Service: OAuth2Service = mockOAuth2Service,

В других местах это может пригодиться, но вы, вероятно, не должны загрязнять свойпроизводственный код по умолчанию с настройками по умолчанию для тестовых объектов.

...