# How to ガイド - テストの作成

ここでは、コネクターにある lambda のテストを作成する方法について説明します。1つのアクションの execute lambda についてテストを作成しますが、他の lambda についても同様の方法でテストを作成できます。

# サンプルコネクター

connector.rb のコードを以下に示します。

{
  title: 'Chargebee-demo',

  connection: {
    fields: [
      {
        name: 'api_key',
        control_type: 'password',
        hint: 'You can find your API key final change3' \
          "under 'Settings'=>'Configure Chargebee'=>'API Keys and Webhooks'" \
          " in Chargebee's web console.",
        label: 'Your API Key'
      },
      {
        name: 'domain',
        control_type: 'subdomain',
        url: 'chargebee.com'
      }
    ],

    authorization: {
      type: 'basic_auth',  

      apply: lambda do |connection|
        user(connection['api_key'])
      end
    },

    base_uri: lambda do |connect|
      "https://#{connect['domain']}.chargebee.com"
    end
  },

  test: lambda do |_connection|
    get('/api/v2/plans', limit: 1)
  end,

  actions: {

    search_customers: {
      title: 'Search customers',
      subtitle: 'Search for customers using name',
      description: 'Search customer in Chargebee',

      input_fields: lambda do |_object_definitions|
        [
          {
            name: 'name',
            label: 'Name to query by',
            hint: 'Provide the name of the customer to query'
          },
          {
            name: 'id',
            label: 'Name to query by',
            hint: 'Provide the name of the customer to query'
          }
        ]
      end,

      execute: lambda do |_connection, input, _input_schema, _output_schema|
        get('/api/v2/customers', input)
      end,

      output_fields: lambda do |_object_definitions|
        [
          {
            name: 'first_name'
          },
          {
            name: 'last_name'
          },
          {
            name: 'id'
          }
        ]
      end
    }

  },
  
}

settings.yaml.enc に格納されている資格情報です。

api_key: valid_api_key
domain: valid_domain

# テストの生成

アクションごとに個別に spec ファイルを作成したり、workato generate test コマンドを使用してコネクターを元にテストを生成したりすることができます。生成される spec ファイルには、テストを書き始めるのに必要なほとんどのスタブが含まれます。

# サンプルの RSpec の内容

RSpec.describe 'actions/search_customers', :vcr do

  subject(:output) { connector.actions.search_customers(input) }
  
  let(:connector) { Workato::Connector::Sdk::Connector.from_file('connector.rb', settings) }
  let(:settings) { Workato::Connector::Sdk::Settings.from_default_file }
  let(:input) { JSON.parse(File.read('fixtures/actions/search_customers/input.json')) }

  let(:expected_output) { JSON.parse(File.read('fixtures/actions/search_customers/output.json')) }

  describe 'given valid input' do
    it 'gives expected output' do
      expect(output).to eq(expected_output)
    end
  end

  let(:action) { connector.actions.search_customers }

  describe 'execute' do
    subject(:output) { action.execute(settings, input) }
    let(:input) { JSON.parse(File.read('fixtures/actions/search_customers/input_parsed.json')) }
    let(:expected_output) { JSON.parse(File.read('fixtures/actions/search_customers/output.json')) }

    context 'given valid input' do
      it 'gives expected output' do
        expect(output).to eq(expected_output)
      end
    end
  end

  describe 'sample_output' do
    subject(:sample_output) { action.sample_output(settings, input) }

    pending 'add some examples'
  end

  describe 'input_fields' do
    subject(:input_fields) { action.input_fields(settings, config_fields) }

    pending 'add some examples'
  end

  describe 'output_fields' do
    subject(:output_fields) { action.output_fields(settings, config_fields) }

    pending 'add some examples'
  end
end

ここには、このアクションのさまざまなテストのスタブが用意されています。これは Gem を使用してテストを生成する際に提供されます。今回は、execute lambda だけのテストを作成する方法について説明します。

# ステップ1 - コネクターインスタンスの定義

テストを開始するには、Workato SDK Gem を使用してコネクターのインスタンスを作成する必要があります。

  let(:connector) { Workato::Connector::Sdk::Connector.from_file('connector.rb', settings) }

# ステップ2 - 設定インスタンスの定義

次に、Workato SDK Gem を使用して設定のインスタンスを作成する必要があります。これは、Workato でのコネクションと同じことを意味します。前に定義したコネクターインスタンスも、この設定インスタンスを使うことに注意してください。

  let(:settings) { Workato::Connector::Sdk::Settings.from_default_file }

# ステップ3 - アクションの定義

関連するインスタンスを作成したら、テストの残りの部分で簡単に参照できるように action をインスタンス化しておきます。

  let(:action) { connector.actions.search_customers }

# ステップ3 - テストの説明と対象の定義

ここで、実行したいテスト「群」について説明します。ここではキーワードに execute を使います。その後に、テストの subject (対象) も定義します。ここで、search_customers アクションの execute lambda を実行しているコネクターインスタンスに output の値を割り当てます。これは action.execute(settings,input) を定義することで行われます。

  describe 'execute' do
    subject(:output) { action.execute(settings, input) }

TIP

テストを作成する際、execute に2つの引数 (extended_input_schemaextended_output_schema) が追加されていることを不思議に思うかもしれません。コネクターで定義する execute: lambda と同様、ここでの execute は同じ4つの引数を受け取ることができます。このアクションでは不要なため、削除してあります。

# ステップ4 - 個々のテストに対するアサーションの宣言

テストの成功または失敗を判断するには、比較を宣言しておく必要があります。

ここでは、execute lambda の出力が、有効な入力を指定した場合の既知のレスポンスと等しくなることを「expect (期待)」すると宣言しています。inputexpected_output という2つの新しい変数を作成して、この宣言を行っています。expected_output を手動で生成する必要はありませんが、CLI コマンドを実行して execute lambda を呼び出すと生成されます。例: workato exec actions.search_customers.execute --input='fixtures/actions/search_customers/input.json' --output='fixtures/actions/search_customers/output.json'

  describe 'execute' do
    subject(:output) { action.execute(settings, input) }
    let(:input) { JSON.parse(File.read('fixtures/actions/search_customers/input.json')) }
    let(:expected_output) { JSON.parse(File.read('fixtures/actions/search_customers/output.json')) }

    context 'given valid input' do
      it 'gives expected output' do
        expect(output).to eq(expected_output)
      end
    end
  end

# ステップ5 - RSpec テストの実行

最後のステップは、RSpec テストを実行することです。これは bundle exec rspec spec/actions/search_customers_spec.rb コマンドで実行されます。

$ bundle exec rspec spec/actions/search_customers_spec.rb 

actions/search_customers
  execute
    given valid input
      gives expected output
  sample_output
    add some examples (PENDING: Not yet implemented)
  input_fields
    add some examples (PENDING: Not yet implemented)
  output_fields
    add some examples (PENDING: Not yet implemented)

Pending: (Failures listed here are expected and do not affect your suites status)

  1) actions/search_customers sample_output add some examples
     # Not yet implemented
     # ./spec/actions/search_customers_spec.rb:28

  2) actions/search_customers input_fields add some examples
     # Not yet implemented
     # ./spec/actions/search_customers_spec.rb:34

  3) actions/search_customers output_fields add some examples
     # Not yet implemented
     # ./spec/actions/search_customers_spec.rb:40


Finished in 0.03218 seconds (files took 0.90373 seconds to load)
4 examples, 0 failures, 3 pending


Last updated: 2023/8/31 1:07:14