ハウツーガイド - ストリーミングトリガー/アクションのテストの記述

このページは機械翻訳により提供されています。翻訳内容と英語版に相違がある場合は、英語版が優先されます。

このセグメントでは、汎用的なURLへのファイルアップロードコネクターの例を参考に、Workatoのファイルストリーミング機能を利用するアクションのテストの記述について説明します。

テストの生成

アクションごとに個別のspecファイルを作成することも、workato generate testコマンドを使用してconnectorに基づいてテストを生成することもできます。 これにより、テストの作成を開始するために必要なスタブの大半を含むspecファイルが生成されます。

サンプルRSpecコンテンツ

ruby
RSpec.describe 'actions/upload_file_to_url', :vcr do

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

  before do
    stub_const('Workato::Connector::Sdk::Stream::Reader::DEFAULT_FRAME_SIZE', 5.kilobytes)
  end

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

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

    let(:input) do
      {
          "file_name": "sample_file",
          "file": {
            "__stream__": true,
            "chunks": {
              "0": "abcd",
              "4": "efgh",
              "8": "ijkl",
              "12": "mn"
            }
          },
          "url": "https://www.friendly_s3_url.com/upload"
      }
    end

    it 'given simple stream' do
      it 'produces a file' do
        is_expected.to include(:file_size)
        expect(output.file_size).to eq(13)

        is_expected.to include(:file_path)

        is_expected.to include(:file_name)
      end
    end
  end

end

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

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

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

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

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

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

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

関連するインスタンスを作成したら、残りのテストで参照しやすいようにactionをインスタンス化します。

ruby
  let(:action) { connector.actions.upload_file_to_url }

ステップ3 - テストの説明、subjectと入力の定義

ここでは、実行するテストの"family"を記述します。 この場合、キーワードexecuteを使用します。 次に、subjectをアクションの実行結果である出力にします。 最後に、シンプルなストリームであるinputを宣言します。

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

    let(:input) do
      {
          "file_name": "sample_file",
          "file": {
            # this hash simulates a file stream which is
            # the output of a download file object
            "__stream__": true,
            "chunks": {
              "0": "abcd",
              "4": "efgh",
              "8": "ijkl",
              "12": "mn"
            }
          },
          "url": "https://www.friendly_s3_url.com/upload"
      }
    end

ステップ4 - 個々のテストのアサーションの宣言

テストが成功または失敗するには、宣言された比較が必要です。

ここでは、executeラムダの出力にキーfile_sizefile_pathfile_nameが含まれることを"expect"すると宣言しています。 さらに、file_sizeの値が13であることを期待します。

ruby
  it 'given simple stream' do
    it 'produces a file' do
      is_expected.to include(:file_size)
      expect(output.file_size).to eq(13)

      is_expected.to include(:file_path)

      is_expected.to include(:file_name)
    end
  end

RSpecでストリームをモックするバリエーション

RSpecテスト内でシンプルなストリームをモックするだけでなく、他のバリエーションもモックできます。

各チャンクを明示的に指定してストリームをモックする

ruby
let(:input) do
  {
      file_name: 'sample_file',
      file: {
        __stream__: true,
        chunks: {
          0 => 'abcd',
          4 => 'efgh',
          8 => 'ijkl',
          12 => 'mn'
        }
      },
      url: 'https://www.friendly_s3_url.com/upload'
  }
end

同じコネクター内のダウンロードファイルアクション/トリガー用に実装されたストリームを利用してストリームをモックする

ruby
let(:input) do
  {
      file_name: 'sample_file',
      file: {
        __stream__: true,
        name: 'global_stream',
        input: {
          file_path: '/path/to/sample/file'
        }
      },
      url: 'https://www.friendly_s3_url.com/upload'
  }
end

独自の認証を持つストリームのインライン定義を指定して、ストリームをモックします

TIP

このような高度なモックは、RSpecテストでのみ使用でき、CLI実行では使用できません。

ruby
let(:input) do
  {
      file_name: 'sample_file',
      file: {
        __stream__: true,
        name: 'mock_advanced_stream',
        input: {
          file_path: '/path/to/sample/file'
        },
        settings: {
          # optional
          # A connection settings for stream mock application
          # if the mock makes authorized requests to external apps
          # Also can use Workato::Connector::Sdk::Settings.from_file
          domain: 'acme.egnyte.com',
          api_key: 'api_key'
        },
        connection: {
          # optional
          # A connection definition for stream source applications
          # if the mock makes authorized requests to external apps
          # It supports the same blocks as connector's connection definition
          authorization: {
            type: 'api_key',

            apply: lambda do |connection|
              headers(api_key: connection['api_key'])
            end
        },
        },
        chunks: lambda do |input, _first_byte, last_byte, size|
          chunk = get("/pubapi/v1/fs-content/#{file_path}").
              headers("Range": "bytes=#{starting_byte_range}-#{ending_byte_range}").
              response_format_raw

          [chunk, chunk.size < requested_byte_size]
        end
      },
      url: 'https://www.friendly_s3_url.com/upload'
  }
end

静的ストリームを指定してストリームをモックする

ruby
let(:input) do
  {
      file_name: 'sample_file',
      file: {
        data: '1234567890',
        oef: true
      },
      url: 'https://www.friendly_s3_url.com/upload'
  }
end

文字列を指定してストリームをモックする

ruby
let(:input) do
  {
      file_name: 'sample_file',
      file: 'qwertyuiop[]',
      url: 'https://www.friendly_s3_url.com/upload'
  }
end

Last updated: