オントロジーファンクションユニットテストオントロジー編集の確認

注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

オントロジー編集の確認

関数によって行われた編集を確認するために、verifyOntologyEditFunction() APIを使用できます。これを"@foundry/functions-testing-lib"からインポートする必要があります。これにより、以下に示すワークフローを围む単体テストを作成することができます。

オブジェクト作成の確認

オブジェクトの作成を確認するために、.createsObjectsメソッドを使用できます。以下に例を示します:

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import { MyFunctions } from ".." import { Objects , ExampleDataAirport } from "@foundry/ontology-api"; import { verifyOntologyEditFunction } from "@foundry/functions-testing-lib"; // テストスイートの例 describe("example test suite", () => { const myFunctions = new MyFunctions(); // 空港を作成するテスト test("create airport", () => { verifyOntologyEditFunction(() => myFunctions.createAirport("airportCode", "airportDisplayName")) // 以下のオブジェクトが作成されることを検証 .createsObject( { objectType: ExampleDataAirport, properties: { airport: "airportCode", displayAirportName: "airportDisplayName", }, }); }); });

この関数をテストするために使用できます:

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 import { Function, OntologyEditFunction, Edits } from "@foundry/functions-api"; import { Objects, ExampleDataAirport } from "@foundry/ontology-api"; export class MyFunctions { @Edits(ExampleDataAirport) // ExampleDataAirportを編集するためのデコレータ @OntologyEditFunction() // オントロジー編集関数のデコレータ public createAirport(airport: string, displayName: string): void { const newAirport = Objects.create().exampleDataAirport(airport); // 新しい空港オブジェクトを作成 newAirport.displayAirportName = displayName; // 作成した空港オブジェクトの名前を設定 } }

新規作成オブジェクトの編集を確認する

新規作成されたオブジェクトに関連する編集を確認することができます。例えば、新たな ExampleDataFlight オブジェクトを作成し、そのリンクが new-flight-delay-0 に作成されたことを確認したい場合などです。以下に例を示します:

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 import { MyFunctions } from ".." // オブジェクトとデータのインポート import { Objects , ExampleDataFlight, ExampleFlightDelayEvent } from "@foundry/ontology-api"; // テスト関数のインポート import { verifyOntologyEditFunction } from "@foundry/functions-testing-lib"; // テストスイートの定義 describe("example test suite", () => { const myFunctions = new MyFunctions(); // テストケース:単一キーと単一オブジェクトの作成 test("single key with single created object", () => { // フライトオブジェクトの作成 const flight = Objects.create().exampleDataFlight("flightTest"); // 関数の実行と結果の検証 verifyOntologyEditFunction(() => myFunctions.createAndLinkDelays(flight, 1)) .createsObject({ objectType: ExampleFlightDelayEvent, properties: { eventId: "new-flight-delay-0", }, }) .addsLink(edits => ({ link: flight.flightDelayEvent, linkedObject: edits.createdObjects.byObjectType(ExampleFlightDelayEvent)[0], })) }); });

これは、以下の関数をテストするために使用できます:

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 // "@foundry/functions-api"からいくつかのクラスと関数をインポートします import { Function, Integer, OntologyEditFunction, Edits } from "@foundry/functions-api"; // "@foundry/ontology-api"からいくつかのクラスとデータをインポートします import { Objects, ExampleDataFlight, ExampleFlightDelayEvent } from "@foundry/ontology-api"; // MyFunctionsというクラスをエクスポートします export class MyFunctions { // ExampleDataFlightとExampleFlightDelayEventに対する編集を表すデコレータ @Edits(ExampleDataFlight, ExampleFlightDelayEvent ) // オントロジー編集関数を表すデコレータ @OntologyEditFunction() // 遅延を生成し、それをフライトにリンクする関数 public createAndLinkDelays(flight: ExampleDataFlight, numDelay: Integer): void { // 指定された数だけ遅延イベントを生成し、それをフライトにリンクします for (let n = 0; n < numDelay; n++) { // 遅延イベントを生成します const delay = Objects.create().exampleFlightDelayEvent(`new-flight-delay-${n}`); // 生成した遅延イベントをフライトにリンクします flight.flightDelayEvent.add(delay); } } }

オブジェクトプロパティの編集を確認する

プロパティの編集を .modifiesObjects を使用して確認することができます。以下に例を示します:

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 import { MyFunctions } from ".." import { Objects , ExampleDataFlight, ExampleFlightDelayEvent } from "@foundry/ontology-api"; import { verifyOntologyEditFunction } from "@foundry/functions-testing-lib"; describe("example test suite", () => { const myFunctions = new MyFunctions(); test("modifies aircraft of the flight", () => { // フライトオブジェクトを作成 const flight = Objects.create().exampleDataFlight("NY -> LA"); // 古い航空機オブジェクトを作成 const oldAircraft = Objects.create().exampleDataAircraft("N11111"); // フライトに古い航空機を設定 flight.aircraft.set(oldAircraft); // 新しい航空機オブジェクトを作成 const newAircraft = Objects.create().exampleDataAircraft("A00000"); // 新しい航空機をフライトに割り当てる関数を検証 verifyOntologyEditFunction(() => myFunctions.assignAircraftToFlight(flight, newAircraft)) .modifiesObject( { object: flight, properties: { // 新しい航空機のテールナンバーを確認 tailNumber: "A00000" } }) }); });

これは、次の関数のテストに使用できます:

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, ExampleFlightDelayEvent } from "@foundry/ontology-api"; export class MyFunctions { // 航空機をフライトに割り当てる関数 @Edits(ExampleDataFlight) @OntologyEditFunction() public assignAircraftToFlight(flight: ExampleDataFlight, aircraft: ExampleDataAircraft): void { flight.aircraft.clear(); // フライトの航空機をクリア aircraft.flight.set(flight); // 航空機にフライトをセット flight.tailNumber = aircraft.tailNumber; // フライトに航空機のテールナンバーをセット } }

オブジェクトへの他の編集がないことを確認する

オプションの .hasNoMoreEdits() を使用して、他の編集がないことを確認できます。これは、指定された編集のみが許可され、他の編集が検出された場合に検証が失敗することを意味します。以下に例を示します:

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import { MyFunctions } from ".." import { Objects , ExampleDataFlight, ExampleFlightDelayEvent } from "@foundry/ontology-api"; import { verifyOntologyEditFunction } from "@foundry/functions-testing-lib"; // テストスイートの例 describe("example test suite", () => { const myFunctions = new MyFunctions(); // 関連付けられたオブジェクトを持つ単一のキー test("single key with linked object", () => { const flight = Objects.create().exampleDataFlight("flightAnotherTest"); const delay = Objects.create().exampleFlightDelayEvent("new-flight-delay") // linkDelays関数のテスト verifyOntologyEditFunction(() => myFunctions.linkDelays(flight, delay)) .addsLink({link: flight.flightDelayEvent, linkedObject: delay }) .hasNoMoreEdits(); }); });

.hasNoMoreEdits()を使用する際、特定の種類の編集を無視することができます。これは、以下のいくつかまたはすべてを含むオブジェクトを渡すことで行います。

  • ignoreExtraCreatedObjects: true
  • ignoreExtraModifiedObjects: true
  • ignoreExtraDeletedObjects: true
  • ignoreExtraLinkedObjects: true
  • ignoreExtraUnlinkedObjects: true

オブジェクトへのリンク作成を確認する

オブジェクトへのリンク作成を.addsLinkを使って確認することができます。以下に例を示します:

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 // モジュールをインポートします import { MyFunctions } from ".." import { Objects , ExampleDataFlight, ExampleFlightDelayEvent } from "@foundry/ontology-api"; import { verifyOntologyEditFunction } from "@foundry/functions-testing-lib"; // "example test suite"という名前のテストスイートを記述します describe("example test suite", () => { // MyFunctionsの新しいインスタンスを作成します const myFunctions = new MyFunctions(); // "single key with linked object"という名前のテストを記述します test("single key with linked object", () => { // フライトオブジェクトと遅延イベントオブジェクトを作成します const flight = Objects.create().exampleDataFlight("flightAnotherTest"); const delay = Objects.create().exampleFlightDelayEvent("new-flight-delay") // linkDelays関数が正しくリンクを追加し、その後他の編集を行わないことを検証します verifyOntologyEditFunction(() => myFunctions.linkDelays(flight, delay)) .addsLink({link: flight.flightDelayEvent, linkedObject: delay }) .hasNoMoreEdits(); }); });

このテストは、逆方向に同じリンクをテストするのと同等です:

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import { MyFunctions } from ".." import { Objects , ExampleDataFlight, ExampleFlightDelayEvent } from "@foundry/ontology-api"; import { verifyOntologyEditFunction } from "@foundry/functions-testing-lib"; describe("example test suite", () => { const myFunctions = new MyFunctions(); test("single key with linked object reverse", () => { // 飛行オブジェクトを作成 const flight = Objects.create().exampleDataFlight("flightAnotherTest"); // 遅延オブジェクトを作成 const delay = Objects.create().exampleFlightDelayEvent("new-flight-delay") // linkDelays関数を検証 verifyOntologyEditFunction(() => myFunctions.linkDelays(flight, delay)) // 関連付けされたオブジェクトを追加 .addsLink({link: delay.flight, linkedObject: flight }) // 他の編集がないことを確認 .hasNoMoreEdits(); }); });

次の関数をテストするためにこれを使用することができます:

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 import { Function, OntologyEditFunction, Edits } from "@foundry/functions-api"; import { Objects, ExampleDataFlight, ExampleFlightDelayEvent } from "@foundry/ontology-api"; export class MyFunctions { // 飛行機の遅延イベントと遅延データを関連付ける関数 @Edits(ExampleDataFlight, ExampleFlightDelayEvent ) @OntologyEditFunction() public linkDelays(flight: ExampleDataFlight, delay: ExampleFlightDelayEvent): void { // 遅延イベントをフライトデータに追加 flight.flightDelayEvent.add(delay); } }

オブジェクトからのリンク削除を確認する

オブジェクトからのリンク削除を確認するには、.removesLink を使用します。以下に例を示します:

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 import { MyFunctions } from ".." // オントロジーAPIからのインポート import { Objects , ExampleDataFlight, ExampleFlightDelayEvent } from "@foundry/ontology-api"; // テスト用ライブラリからのインポート import { verifyOntologyEditFunction } from "@foundry/functions-testing-lib"; // テストスイートの例 describe("example test suite", () => { const myFunctions = new MyFunctions(); // リンク削除のテスト test("test link removal", () => { // フライトオブジェクトを作成 const flight = Objects.create().exampleDataFlight("flightAnotherTest"); // 遅延イベントオブジェクトを作成 const delay = Objects.create().exampleFlightDelayEvent("new-flight-delay") // フライトオブジェクトに遅延イベントを追加 flight.flightDelayEvent.add(delay); // removeAllDelays関数をテスト verifyOntologyEditFunction(() => myFunctions.removeAllDelays(flight)) // リンクが削除されたことを確認 .removesLink({link: flight.flightDelayEvent, unlinkedObject: delay }) // それ以上の編集がないことを確認 .hasNoMoreEdits(); }); });

次の関数をテストするためにこれを使用できます:

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 import { Function, OntologyEditFunction, Edits } from "@foundry/functions-api"; import { Objects, ExampleDataFlight, ExampleFlightDelayEvent } from "@foundry/ontology-api"; export class MyFunctions { // 関数:全ての遅延を削除する @Edits(ExampleDataFlight, ExampleFlightDelayEvent) @OntologyEditFunction() public removeAllDelays(flight: ExampleDataFlight): void { // 遅延イベントをクリアする flight.flightDelayEvent.clear(); } }

オブジェクトの削除を検証する

.deletesObject を使用して、オブジェクトの削除を検証することができます。例を示します:

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import { MyFunctions } from ".." // "@foundry/ontology-api" から Objects と ExampleDataFlight をインポート import { Objects , ExampleDataFlight } from "@foundry/ontology-api"; // "@foundry/functions-testing-lib" から verifyOntologyEditFunction をインポート import { verifyOntologyEditFunction } from "@foundry/functions-testing-lib"; // テストスイートの例 describe("example test suite", () => { const myFunctions = new MyFunctions(); // オブジェクト削除のテスト test("test object deletion", () => { // フライトオブジェクトを作成 const flight = Objects.create().exampleDataFlight("flightAnotherTest"); // deleteFlight 関数を使ってオブジェクトを削除し、結果を検証 verifyOntologyEditFunction(() => myFunctions.deleteFlight(flight)) .deletesObject(flight) .hasNoMoreEdits(); }); });

次の関数をテストするために利用することができます:

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"; // "MyFunctions"という名前のクラスをエクスポートします export class MyFunctions { // "ExampleDataFlight"に対する編集を行うという意味のデコレータを追加します @Edits(ExampleDataFlight) // オントロジーの編集関数を示すデコレータを追加します @OntologyEditFunction() // "deleteFlight"という名前のpublicメソッドを定義します。このメソッドは"ExampleDataFlight"型の"flight"を引数に取り、何も返しません(void) public deleteFlight(flight: ExampleDataFlight): void { // 引数で受け取った"flight"を削除します flight.delete(); } }

複数のオブジェクトが作成されたことを確認する

.createsObjects メソッドを使用し、リストを渡してテスト用に複数のオブジェクトを作成することができます。以下に例を示します。

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 31 32 33 import { MyFunctions } from ".." import { Objects , ExampleDataFlight, ExampleFlightDelayEvent } from "@foundry/ontology-api"; import { verifyOntologyEditFunction } from "@foundry/functions-testing-lib"; describe("example test suite", () => { const myFunctions = new MyFunctions(); test("single key with many created objects", () => { // 飛行オブジェクトを作成 const flight = Objects.create().exampleDataFlight("flightTest"); // createAndLinkDelays関数を検証 verifyOntologyEditFunction(() => myFunctions.createAndLinkDelays(flight, 3)) // オブジェクトの作成を確認 .createsObjects( [0, 1, 2].map(i => ({ objectType: ExampleFlightDelayEvent, properties: { eventId: "new-flight-delay-" + i, }, })), ) // リンクの追加を確認 .addsLinks(edits => edits.createdObjects.byObjectType(ExampleFlightDelayEvent).map(event => ({ link: flight.flightDelayEvent, linkedObject: event, })), ) // それ以上の編集がないことを確認 .hasNoMoreEdits(); }); });

次の関数をテストするために使用できます:

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 // "@foundry/functions-api"からいくつかのクラスや関数をインポートします import { Function, Integer, OntologyEditFunction, Edits } from "@foundry/functions-api"; // "@foundry/ontology-api"からいくつかのクラスや関数をインポートします import { Objects, ExampleDataFlight, ExampleFlightDelayEvent } from "@foundry/ontology-api"; // MyFunctionsクラスを定義します export class MyFunctions { // Editsデコレータは、この関数がどのオブジェクトを編集するかを示します // OntologyEditFunctionデコレータは、この関数がオントロジーの編集機能であることを示します @Edits(ExampleDataFlight, ExampleFlightDelayEvent ) @OntologyEditFunction() // createAndLinkDelaysという名前の関数を定義します。この関数は、フライトと遅延数を引数に取り、何も返しません public createAndLinkDelays(flight: ExampleDataFlight, numDelay: Integer): void { // 遅延数だけループを回します for (let n = 0; n < numDelay; n++) { // 新しい遅延イベントを作成します const delay = Objects.create().exampleFlightDelayEvent(`new-flight-delay-${n}`); // 作成した遅延イベントをフライトに追加します flight.flightDelayEvent.add(delay); } } }

非同期オントロジー編集の確認

非同期オントロジー編集を次のように確認できます:

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import { verifyOntologyEditFunction } from "@foundry/functions-testing-lib"; test("test async edit function", async () => { // オブジェクトを作成する const obj = Objects.create().objectWithAllPropertyTypes(1); // 非同期編集機能を検証する (await verifyOntologyEditFunction(() => myFunctions.setDateAndTimestampToNow(obj))).modifiesObject({ object: obj, properties: { // タイムスタンププロパティを現在のタイムスタンプに設定する timestampProperty: makeTimestamp(), }, }); });

複数の検証

上記の例で見たように、私たちは検証を連鎖させることができます。以下のパターンがこれを示しています:

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 // "@foundry/functions-testing-lib" から "verifyOntologyEditFunction" をインポートします import { verifyOntologyEditFunction } from "@foundry/functions-testing-lib"; // "@foundry/ontology-api" から "Objects"、"ExampleDataObject" をインポートします import { Objects, ExampleDataObject } from "@foundry/ontology-api"; // "multiple action edit" というテストを行います test("multiple action edit", () => { // myFunctions.multistageEdits関数に "objectId"、"objectName" を渡し、その結果を verifyOntologyEditFunction で検証します verifyOntologyEditFunction(() => myFunctions.multistageEdits("objectId", "objectName")) // オブジェクトを作成します .createsObject({...}) // オブジェクトを変更します .modifiesObjects({...}) // リンクを追加します .addsLinks({...}) // リンクを削除します .removesLinks({...}) // オブジェクトを削除します .deletesObject(...) // これ以上の編集がないことを確認します .hasNoMoreEdits(); });