jest.spyOn()
을 사용하여 테스트를 실행하는 모의를 주입함으로써 비결정적 Functions의 결과물을 지정할 수 있습니다.
Uuid
의 결과물을 모의를 주입함으로써 지정할 수 있습니다. 예시는 다음과 같습니다:
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
// 필요한 라이브러리와 함수를 불러옵니다. import { MyFunctions } from ".." // MyFunctions 클래스를 불러옵니다. import { Objects, ExampleDataFlight } from "@foundry/ontology-api"; // ontology-api 라이브러리에서 Objects, ExampleDataFlight를 불러옵니다. import { verifyOntologyEditFunction } from "@foundry/functions-testing-lib"; // functions-testing-lib 라이브러리에서 verifyOntologyEditFunction를 불러옵니다. import { Uuid } from "@foundry/functions-utils"; // functions-utils 라이브러리에서 Uuid를 불러옵니다. // 테스트 스위트를 정의합니다. describe("example test suite", () => { const myFunctions = new MyFunctions(); // MyFunctions 클래스의 인스턴스를 생성합니다. // 새로운 비행을 생성하는 테스트를 정의합니다. test("creates new flight", () => { const makeUuid = () => "my-uuid"; // UUID를 생성하는 함수를 정의합니다. jest.spyOn(Uuid, "random").mockImplementation(() => makeUuid()); // Uuid의 random 메소드를 스파이하고, 그것의 구현을 makeUuid 함수로 대체합니다. // Ontology 편집 함수가 새로운 객체를 생성하는지 검증합니다. verifyOntologyEditFunction(() => myFunctions.createNewFlight()) .createsObject({ objectType: ExampleDataFlight, // 생성되어야 하는 객체의 타입을 ExampleDataFlight로 지정합니다. properties: { flightId: makeUuid() // 생성되어야 하는 객체의 flightId 프로퍼티를 설정합니다. } }) }) });
다음 기능을 테스트하는데 사용할 수 있습니다:
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
// "@foundry/functions-api"에서 Function, OntologyEditFunction, Edits를 가져옵니다. import { Function, OntologyEditFunction, Edits } from "@foundry/functions-api"; // "@foundry/ontology-api"에서 Objects, ExampleDataFlight를 가져옵니다. import { Objects, ExampleDataFlight } from "@foundry/ontology-api"; // "@foundry/functions-utils"에서 Uuid를 가져옵니다. import { Uuid } from "@foundry/functions-utils"; // MyFunctions라는 클래스를 선언합니다. export class MyFunctions { // ExampleDataFlight를 수정하는 함수를 선언합니다. @Edits(ExampleDataFlight) // OntologyEditFunction 장식자를 사용하여 Ontology 수정 함수임을 명시합니다. @OntologyEditFunction() // 새로운 비행 데이터를 생성하는 함수를 선언합니다. public createNewFlight(): void { // Objects.create()를 사용하여 새로운 객체를 생성하고, 이 객체의 exampleDataFlight 필드에 임의의 Uuid를 할당합니다. Objects.create().exampleDataFlight(Uuid.random()); } }
Uuid
의 결과물을 완전히 제어하려는 경우가 있습니다. 이렇게 하려면 테스트하는 함수의 코드를 조정해야 합니다. 예를 들어, 위의 createNewFlight
함수는 MyFunctions
클래스에 래핑되어 있고 기본값이 있는 공급자를 사용하여 클래스에 생성자를 추가할 수 있습니다. 공급자가 있는 업데이트된 함수는 다음과 같습니다:
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
import { Function, OntologyEditFunction, Edits } from "@foundry/functions-api"; import { Objects, ExampleDataFlight } from "@foundry/ontology-api"; import { Uuid } from "@foundry/functions-utils"; export class MyFunctions { // 이 클래스의 새로운 생성자는 공급자를 가져옵니다 constructor (private UuidSupplier: () => string = Uuid.random){} @Edits(ExampleDataFlight) @OntologyEditFunction() // 생성자를 사용하여 새로운 비행을 생성하는 함수 public createNewFlightWithConstructor(): void { Objects.create().exampleDataFlight(this.UuidSupplier()); } }
번역된 주석:
Uuid
를 my-other-uuid
로 설정합니다):Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
import { MyFunctions } from ".." import { Objects , ExampleDataFlight } from "@foundry/ontology-api"; import { verifyOntologyEditFunction } from "@foundry/functions-testing-lib"; import { Uuid } from "@foundry/functions-utils"; describe("예제 테스트 스위트", () => { const myFunctions = new MyFunctions(); test("공급자와 함께 새로운 항공편 생성", () => { // 새로운 MyFunctions 객체 생성 const myNewFunctions = new MyFunctions(() => "my-other-uuid"); // 새로운 항공편 생성 테스트 verifyOntologyEditFunction(() => myNewFunctions.createNewFlightWithConstructor()) .createsObject({ objectType: ExampleDataFlight, properties: { flightId: "my-other-uuid" } }) }) });
Timestamp.now()
의 결과물을 모의로 지정할 수 있습니다. 예시는 다음과 같습니다:
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
import { MyFunctions } from ".." import { Objects , ExampleDataFlight } from "@foundry/ontology-api"; import { verifyOntologyEditFunction } from "@foundry/functions-testing-lib"; import { Timestamp } from "@foundry/functions-api"; // 테스트 스위트 예제 describe("example test suite", () => { // MyFunctions 클래스의 인스턴스 생성 const myFunctions = new MyFunctions(); // "test timestamp now" 테스트 케이스 test("test timestamp now", () => { // 특정 시간의 Timestamp를 생성하는 함수 const makeTimestamp = () => Timestamp.fromISOString("2018-06-13T12:11:13+05:00"); // Timestamp의 now 메소드를 가로채어, 항상 특정 시간의 Timestamp를 반환하도록 목(mock) 설정 jest.spyOn(Timestamp, "now").mockImplementation(() => makeTimestamp()); // 플라이트 객체 생성 const flight = Objects.create().exampleDataFlight("flightAnotherTest"); // startTakeoff 메소드가 플라이트 객체의 takeoff 속성을 정상적으로 변경하는지 검증 verifyOntologyEditFunction(() => myFunctions.startTakeoff(flight)) .modifiesObject({ object: flight, properties: { takeoff: makeTimestamp() } }) }) });
다음 함수를 테스트하는 데 사용할 수 있습니다:
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
// "@foundry/functions-api"에서 필요한 요소들을 import합니다. import { Function, OntologyEditFunction, Edits, Timestamp } from "@foundry/functions-api"; // "@foundry/ontology-api"에서 필요한 요소들을 import합니다. import { Objects, ExampleDataFlight } from "@foundry/ontology-api"; // MyFunctions라는 클래스를 선언합니다. export class MyFunctions { // ExampleDataFlight을 수정하는 함수를 정의합니다. @Edits(ExampleDataFlight) // 온톨로지 수정 함수를 정의합니다. @OntologyEditFunction() // startTakeoff이라는 public 함수를 선언하고, 이 함수는 ExampleDataFlight 타입의 flight를 매개변수로 받습니다. public startTakeoff(flight: ExampleDataFlight): void { // flight의 이륙 시간을 현재 시간으로 설정합니다. flight.takeoff = Timestamp.now(); } }
모의 객체를 주입하여 LocalDate.now()
의 결과물을 지정할 수 있습니다. 다음은 그 예입니다:
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
import { MyFunctions } from ".." import { Objects , ExampleDataFlight } from "@foundry/ontology-api"; import { verifyOntologyEditFunction } from "@foundry/functions-testing-lib"; import { LocalDate } from "@foundry/functions-api"; // 예시 테스트 스위트를 설명합니다. describe("example test suite", () => { const myFunctions = new MyFunctions(); // LocalDate now 함수 테스트 test("test LocalDate now", () => { // LocalDate 객체 생성 함수 const makeLocalDate = () => LocalDate.fromISOString("2018-06-13"); // LocalDate.now 함수를 가짜로 구현 jest.spyOn(LocalDate, "now").mockImplementation(() => makeLocalDate()); // Flight 객체 생성 const flight = Objects.create().exampleDataFlight("flightTest"); // Ontology 수정 함수 검증 verifyOntologyEditFunction(() => myFunctions.dateTakeoff(flight)) .modifiesObject({ object: flight, properties: { // 날짜 속성에 LocalDate 객체를 설정 date: makeLocalDate() } }) }) });
다음 함수를 테스트하는 데 사용할 수 있습니다:
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
import { Function, OntologyEditFunction, Edits, LocalDate } from "@foundry/functions-api"; import { Objects, ExampleDataFlight } from "@foundry/ontology-api"; // 'MyFunctions'라는 클래스를 선언합니다. export class MyFunctions { // 'ExampleDataFlight' 데이터 유형에 대한 수정사항을 선언하는 데코레이터입니다. @Edits(ExampleDataFlight) // 온톨로지 수정 함수를 선언하는 데코레이터입니다. @OntologyEditFunction() // 'dateTakeoff'이라는 public 메서드를 선언하였으며, 이 메서드는 'ExampleDataFlight' 타입의 'flight' 매개변수를 받아서 // 'flight'의 'date' 속성 값을 현재 날짜로 설정합니다. public dateTakeoff(flight: ExampleDataFlight): void { flight.date = LocalDate.now(); } }