Workato：Connector SDKのメソッドの単体テスト手順

# はじめに

WorkatoのConenctor SDKには構造化プログラミング言語のfunctionに相当する機能（メソッド）が用意されています。

https://docs.workato.com/ja/developing-connectors/sdk/sdk-reference/methods.html

メソッドを利用することで、目的ごとに処理を分割できる、１つの処理を複数の処理から呼び出して利用できる、コードの重複や冗長化を避けられる等のメリットがあります。何らかのコードを書いた経験のある方であれば、これらのメリットについて改めて説明する必要もないでしょう。

# Connector SDKにおける単体テスト

WorkatoのConnector SDKには、トリガーとアクションを単体でテストできる機能が用意されています。

この機能を利用することで、次のようにトリガーあるいはアクションごとにWebの開発環境上で単体テストを行うことが可能です。テストのためにレシピを用意する必要もなく、その場でテストが実行でき、その結果を確認できることは、効率的に開発を進める上でもメリットになります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/a32577b9-517f-9041-f29b-59e878e32ade.png)

# Connector SDKにおけるメソッドの単体テスト

先に記載した通り、WorkatoのConnector SDKでは、Webの開発環境上でトリガーとアクションを単体テストすることが可能ですが、メソッドのための単体テスト機能は提供されていません。

※Workato SDK CLIではメソッドの単体テストは可能ですが、Webの開発環境上ではメソッドの単体テストを行うための機能は提供されていません。

このため、メソッドの単体テストを行いたい場合は、デバッグ用のアクションをエントリーポイントとして用意し、そのアクションを介してメソッドを実行する方法で対応します。

次項でコード例を示したうえで、手順を説明していきます。

## コード例

以下はカスタムコネクタのコードの一例になります。

```ruby
{
  title: "testapp",
  connection: {
    fields: [],

    authorization: {
      type: "custom_auth",
      apply: lambda do |connection|
      end
    },

    base_uri: lambda do
      ""
    end
  },

  test: lambda do |_connection|
  end,

  object_definitions: {},

  custom_action: true,

  actions: {},

  triggers: {},

  pick_lists: {},

  methods: {
    hello_world: lambda do |input|
      {
        result: 'hello ' + input['value1'] + ' ' + input['value2'] + ' ' +input['value3']
      }
    end,
    hello_world2: lambda do |input|
      {
        result: 'hello ' + input['value1'] + ' ' + input['value2'] + ' ' +input['value3']
        values: {
            value1: input['value1'],
            value2: input['value1']
            value3: input['value3']
        }
      }
    end    
  }
}

```

上記のうち、 `method` に囲まれた範囲がメソッドのコード（構造化プログラミング言語におけるfunctionに相当するコード）になります。

```ruby
  methods: {
    hello_world: lambda do |input|
      {
        result: 'hello ' + input['value1'] + ' ' + input['value2'] + ' ' +input['value3']
      }
    end,
    hello_world2: lambda do |input|
      {
        result: 'hello ' + input['value1'] + ' ' + input['value2'] + ' ' +input['value3'],
        values: {
            value1: input['value1'],
            value2: input['value2'],
            value3: input['value3']
        }
      }
    end    
  }
  ```

## デバッグ用アクションを追加する

`actions`ブロックへ、次のようなデバッグ用のアクションを追加します。
以下のコードでは、 `debug_method` というアクションを追加しています。

```ruby
actions: {
    debug_method: {
      title: "Debug connector method",
      input_fields: lambda do |object_definitions|
        [
          { name: "method", type: "string", optional: false },
          { name: "json", type: "string", optional: false}
        ]
      end,
      output_fields: lambda do |object_definitions|
        []
      end,
      execute: lambda do |connection, input, input_schema, output_schema|
        call(input['method'], parse_json(input['json']))
      end,
    }
},
```

### input_fields（入力値）

`method` と `json` の２つの文字列型パラメータを追加しています。

`method`は、呼び出されるメソッドの名称がセットされます。 `json`は、メソッドに渡すパラメータがJSONテキストでセットされます。

メソッドに渡すパラメータをJSONテキストとすることで、１つのデバッグアクションで、メソッドごとの異なるパラメータへ対応することが可能です。

### output_fields（戻り値）

戻り値は空の状態とします。今回はWeb上の開発環境での結果確認でのみ使用します（レシピで実行することを想定しない）ため、空の状態でも問題ありません。

### execute（実行ロジック）

input_fieldsの `method` へセットされた値に対応するメソッドを呼び出します。パラメータが必要な場合は、JSONテキストで渡されたパラメータをパースしてメソッドへ渡します。

## 実行

上で実行したデバッグ用アクションを実行してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/bdea7033-ff5c-46fa-bf5f-a8a424aad085.png)

テスト実行するメソッドと、メソッドに渡すパラメータをセットし、テストを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/b7c31dad-a228-1372-aa07-acb70fea6a40.png)

## 実行結果の確認

テスト実行を行うと、次のようにメソッドの実行結果を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/b40aa468-0217-6c75-d202-7f19501eeb13.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/a3b3d26c-98ad-c146-cc68-549377390308.png)