๋ฒ๊ทธ ์ค๋ช
I sinon.createStubInstance(X)
์ฌ๊ธฐ์ X๊ฐ ํ๋ ์ด์์ private ๋ฉค๋ฒ๊ฐ ์๋ ํด๋์ค์ธ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ์์ ๋ฉ๋๋ค.
'SinonStubbedInstance ์ ํ์ ์ธ์
'์(๋) 'Foo' ์ ํ์ ๋งค๊ฐ๋ณ์์ ํ ๋นํ ์ ์์ต๋๋ค.
'SinonStubbedInstance' ์ ํ์ '_private' ์์ฑ์ด ์์ต๋๋ค.' ํ์ง๋ง 'Foo' ์ ํ์๋ ํ์์ ๋๋ค.
describe('SinonTest', () => {
class Foo {
public talk() {
return 'hi';
}
private _private() {
return null;
}
}
function printSpeech(foo: Foo) {
console.log(foo.talk());
}
it('should allow you to pass a stub as a the original', () => {
const mockFoo = sinon.createStubInstance(Foo);
printSpeech(mockFoo);
});
});
์ฌํํ๊ธฐ ์ํด
๋์์ ์ฌํํ๋ ๋จ๊ณ:
printSpeech(mockFoo)
๋ผ์ธ์์ ์ค๋ฅ ๋ณด๊ธฐ์์๋๋ ํ๋
๋๋ ์ด๊ฒ์ด ์ค๋ฅ์์ด ์๋ํ๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค. ๋๋ _private()์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์๊ณ ๊ทธ ๋์์ ์ง์ ํ
์คํธํ ์๊ฐ๋ ์์ง๋ง ๋น๋ ์๊ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํด์๋ ์ ๋ฉ๋๋ค. Jasmine์ ๊ตฌํ์๋ ๋ค๋ฅธ ๊ฒฐํจ์ด ์์ง๋ง Jasmine์ jasmine.createSpyObj
๋ก ์ด ๊ฒฝ์ฐ๋ฅผ ์ง์ํฉ๋๋ค.
์ปจํ ์คํธ(๋ค์ ์ ๋ณด๋ฅผ ์์ฑํ์ญ์์ค):
ํ๊ฒฝ: WSL Ubuntu 16.04, ๋ ธ๋ 10
์ฌ์ฉ ์ค์ธ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: Mocha 5.2.0
ํธ์ง: ์ฌ๊ธฐ stackblitz๊ฐ ์์ต๋๋ค https://stackblitz.com/edit/typescript-nfbgno?file=index.ts
๋ธ๋ผ์ฐ์ ์์ ์คํ ์ค์ด๊ธฐ ๋๋ฌธ์ process.stdout์ ๋ํด ๋ถํํ์ง๋ง ์ค์ ๋ฌธ์ ๋ ์ปดํ์ผ ์๊ฐ์ด๋ฏ๋ก ์ค์ํ์ง ์์ต๋๋ค.
์ด๊ฒ์ Typescript ๋ฌธ์ ์ ๋๋ค. Typescript๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์กฐ์ฌํ๋ ๋ฐ ์๊ฐ์ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ๋๋ค. Typescript๊ฐ ์ด๋ป๊ฒ๋ private ๋ฉค๋ฒ๋ฅผ ์ง์ํ๋ค๋ ๊ฒ์ ํด๋น ์ ํ ์์คํ ์ ์์ฑ์ด๋ฉฐ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํ๋ ์ ์์ต๋๋ค. Typescript๋ฅผ ์ฌ์ฉํ ๋ ๋๋ ์ข ์ข Typescript ํ๋ ์ด๊ทธ๋ผ์ด๋๋ก ์ด๋ํ์ฌ ์ถ๋ ฅ์ ๊ฒ์ฌํ์ฌ ์ด๋ค ์์ ์ ์ํํ๋์ง ์ดํดํจ์ผ๋ก์จ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ๊ทธ๊ฒ์ด ๋น์ ์ด ํด์ผ ํ ์ผ์ด๊ธฐ๋ ํฉ๋๋ค.
์ด๊ฒ์ด ํ์คํ ํด๊ฒฐ์ฑ ์ ์๋์ง๋ง ๋ค์ ๊ธฐ๋ฅ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์์ต๋๋ค.
import { createStubInstance, StubbableType, SinonStubbedInstance, SinonStubbedMember } from 'sinon';
export type StubbedClass<T> = SinonStubbedInstance<T> & T;
export function createSinonStubInstance<T>(
constructor: StubbableType<T>,
overrides?: { [K in keyof T]?: SinonStubbedMember<T[K]> },
): StubbedClass<T> {
const stub = createStubInstance<T>(constructor, overrides);
return stub as unknown as StubbedClass<T>;
}
๋ถ๋ช
ํ ์ด๊ฒ์ ๊ฐ์ธ ๋ฉ์๋๋ฅผ ๊ตฌํํ์ง ์์ผ๋ฏ๋ก ํธ์ถํ ์ ์์ต๋๋ค. ์ด ๋ํผ ํจ์๋ฅผ โโ์ฌ์ฉํ๋ฉด ํด๋์ค์ ๋ชจ๋ ๊ณต์ฉ ํจ์/๋ฉค๋ฒ์ sinon์ ์คํ
๋์ฐ๋ฏธ ํจ์ ๋ฐ StubbedClass์ ๋ํ ์ฝ๋ ์์ฑ์ ์ป์ ์ ์์ต๋๋ค.
@pauloavelar ๋ต๋ณ์ด ์ฌ์ ํ ๊ถ์ฅ๋๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๊น?
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๊ฒ์ด ํ์คํ ํด๊ฒฐ์ฑ ์ ์๋์ง๋ง ๋ค์ ๊ธฐ๋ฅ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์์ต๋๋ค.
๋ถ๋ช ํ ์ด๊ฒ์ ๊ฐ์ธ ๋ฉ์๋๋ฅผ ๊ตฌํํ์ง ์์ผ๋ฏ๋ก ํธ์ถํ ์ ์์ต๋๋ค. ์ด ๋ํผ ํจ์๋ฅผ โโ์ฌ์ฉํ๋ฉด ํด๋์ค์ ๋ชจ๋ ๊ณต์ฉ ํจ์/๋ฉค๋ฒ์ sinon์ ์คํ ๋์ฐ๋ฏธ ํจ์ ๋ฐ StubbedClass์ ๋ํ ์ฝ๋ ์์ฑ์ ์ป์ ์ ์์ต๋๋ค.ํ
์คํธ์์ T๋ก ์ฌ์ฉํ ์ ํจํ ์ ํ์
๋๋ค.