Skip to content

Commit

Permalink
doc: Nestで循環依存がある場合のCONTRIBUTING.mdに書く (#13522)
Browse files Browse the repository at this point in the history
* doc: Nestモジュールテストの例をCONTRIBUTING.mdに書く

* rm normal test

* forwardRef
  • Loading branch information
tamaina authored Mar 5, 2024
1 parent 13f5faf commit 83a5bc0
Showing 1 changed file with 92 additions and 0 deletions.
92 changes: 92 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,98 @@ export const handlers = [

Don't forget to re-run the `.storybook/generate.js` script after adding, editing, or removing the above files.

## Nest

### Nest Service Circular dependency / Nestでサービスの循環参照でエラーが起きた場合

#### forwardRef
まずは簡単に`forwardRef`を試してみる

```typescript
export class FooService {
constructor(
@Inject(forwardRef(() => BarService))
private barService: BarService
) {
}
}
```

#### OnModuleInit
できなければ`OnModuleInit`を使う

```typescript
import { Injectable, OnModuleInit } from '@nestjs/common';
import { ModuleRef } from '@nestjs/core';
import { BarService } from '@/core/BarService';

@Injectable()
export class FooService implements OnModuleInit {
private barService: BarService // constructorから移動してくる

constructor(
private moduleRef: ModuleRef,
) {
}

async onModuleInit() {
this.barService = this.moduleRef.get(BarService.name);
}

public async niceMethod() {
return await this.barService.incredibleMethod({ hoge: 'fuga' });
}
}
```

##### Service Unit Test
テストで`onModuleInit`を呼び出す必要がある

```typescript
// import ...

describe('test', () => {
let app: TestingModule;
let fooService: FooService; // for test case
let barService: BarService; // for test case

beforeEach(async () => {
app = await Test.createTestingModule({
imports: ...,
providers: [
FooService,
{ // mockする (mockは必須ではないかもしれない)
provide: BarService,
useFactory: () => ({
incredibleMethod: jest.fn(),
}),
},
{ // Provideにする
provide: BarService.name,
useExisting: BarService,
},
],
})
.useMocker(...
.compile();

fooService = app.get<FooService>(FooService);
barService = app.get<BarService>(BarService) as jest.Mocked<BarService>;

// onModuleInitを実行する
await fooService.onModuleInit();
});

test('nice', () => {
await fooService.niceMethod();

expect(barService.incredibleMethod).toHaveBeenCalled();
expect(barService.incredibleMethod.mock.lastCall![0])
.toEqual({ hoge: 'fuga' });
});
})
```
## Notes
### Misskeyのドメイン固有の概念は`Mi`をprefixする
Expand Down

0 comments on commit 83a5bc0

Please sign in to comment.