环回 4:用 Sinon 和注入测试问题
Loopback 4: Test problems with Sinon and injections
我们正在尝试使用环回进行测试。测试涉及调用 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 context,将存根绑定到 "services.OAuth2Service"
并使用该上下文创建要测试的控制器。
默认值(可能不是你想要的)
在您使用 @inject
的地方,您提供了一个默认值(可能还有 indicate the dependency is optional),例如像这样:
@inject('services.OAuth2Service', { optional: true })
private oauth2Service: OAuth2Service = mockOAuth2Service,
在其他地方这可能对您很方便,但您可能不应该用默认的测试对象污染您的默认生产代码。
我们正在尝试使用环回进行测试。测试涉及调用 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 context,将存根绑定到
"services.OAuth2Service"
并使用该上下文创建要测试的控制器。默认值(可能不是你想要的)
在您使用 @inject
的地方,您提供了一个默认值(可能还有 indicate the dependency is optional),例如像这样:
@inject('services.OAuth2Service', { optional: true })
private oauth2Service: OAuth2Service = mockOAuth2Service,
在其他地方这可能对您很方便,但您可能不应该用默认的测试对象污染您的默认生产代码。