偽物(ルビー)

Bogusは、独立したユニットテストに伴うリスクを最小限に抑えるために使用されるRuby APIライブラリです。2012年7月にrubygems.orgによって最初にリリースされました。[ 1 ] Bogusを使用すると、外部プログラムとの実際の統合なしに、コードを高速かつ安全にテストできます。Bogusは、必要な外部環境に存在しないメソッドをモック化したりスタブ化したりすることはできません。

ボガス
デザイン:アダム・ポホレツキ、パヴェウ・ピエルチャラ、ピオトル・ショトコフスキ、マレク・ノヴァク
初登場2012年7月30日
安定版リリース
0.1.6 / 2015年1月2日
実装言語Ruby
ライセンスMITライセンス (MIT) Copyright (c) 2012-2013 Adam Pohorecki
ウェブサイトhttps://rubygems.org/gems/bogus

機能

Rubyは、必要なテストフレームワークを実現するためのさまざまな機能を提供します

フェイク

フェイクは、実際のオブジェクトのインターフェースをモックする軽量オブジェクトです。クラスを個別にテストするために、通常、必要なメソッドをスタブ化した統合クラスの代わりに、テストダブルまたは匿名オブジェクトが使用されます。しかし、このアプローチには問題があります。クラスが途中で変更された場合、その変更はモックオブジェクトに反映されず、テストは統合例外なしで実行されます。フェイクは、実際のオブジェクトとまったく同じインターフェースを持ち、実際のクラスが変更されるたびに例外を発生させるため、この問題を解決します

偽造は次の方法を使用して実装できます。

既存のクラスの偽造

偽造はfakeメソッドを呼び出すことで作成されます。

構文:

fake(fake_name, options) { ClassToCopy }

「fake_name」は作成されたフェイクの名前で、コントラクトテストを使用する際にフェイクを識別するために使用できます。省略された場合は匿名のフェイクが作成されます。フェイクは、要件に応じてインスタンスまたはクラスのコピーを返すオプションを提供します。フェイクはスタブメソッドにも適用できます。

グローバル構成

フェイクはスタブの必要性を回避し、( as: :class/ as: :instance[ 2 ] )のような設定項目の多くを排除します。しかし、この種の設定はフェイク定義に追加されるべきであり、共同作業者が増えるほど重複が多くなります。Bogusはこの問題に対処するために、DSL [ 3 ]を導入し、フェイクを一箇所で設定することで、すべてのテストでフェイクの使用を統一します。スタブ化されたメソッドは、フェイクマクロまたはフェイクヘルパー関数を使用してオーバーライドできます。

無名テストダブル

無名テストダブルは、別のテストライブラリからオブジェクトを移行する際の中間ステップとして使用できます。メソッドをモック化せずに観察するのに役立ちます。メソッドはスタブ化できます

  • 任意の数の引数
  • 初期化メソッド内
  • インライン
  • 任意のメソッドを呼び出す

クラスの置き換え

通常、依存性注入はクラスの構成を容易にし、コードをよりモジュール化するために使用されます。クラスを偽物に置き換えることで、この要件を回避できます。作成された偽物クラスには、異なる偽物の名前を付けることができます

ダック型の偽装

システムには、単一の機能を実装する複数のクラスが存在する場合があります。これにより、特定のシナリオにおける実装の選択が複雑になります。Bogusは、クラスに ダック型を作成することでこの問題を解決します

ダックタイプを作成する構文:

make_duck(Class 1, Class 2, Class 3)

Bogus は、fake から複数のクラスが返された場合に自動的にダック型を作成することで、さらに簡素化します。実際、グローバル設定でも同様に実行されます。

契約テスト

偽のスタブで例外処理が期待どおりに行われていることを確認するために、モックオブジェクト用のサンプルテストを作成する必要があります。このテストはBogusによって作成されたものではありませんが、開発者に作成を促すためのものです

verify_contract [ 4 ] (オブジェクト)メソッドは、実際のクラスで行われたすべてのインターセプションを記録し、テストし忘れた偽のオブジェクトに記録されたシナリオがある場合はテストに失敗します。

オブジェクトがモック、スタブ、またはスパイされる際は、入出力パラメータにコントラクトが指定されます。Bogusは、コントラクトが満たされているかどうかを自動的に検証します。モックまたはスタブされたメソッドが実際のオブジェクトで呼び出されない場合、Bogusは失敗します。コントラクトテストは、正しい数のパラメータが渡されているかどうかだけでなく、オブジェクトが正しい引数でテストされているかどうかも確認します。

契約検証は、渡されたコードブロックまたは引数がべき等性[ 5 ]があり、副作用がない場合にのみ正しく識別できます。

スタブ

偽物に加えて、制御の反転の原則が使用されていない 場合、偽物はスタブを許可します。スタブには2つの条件があります

  1. スタブ化されるメソッドが存在している必要があります。
  2. 渡すパラメータは一貫性を保つ必要があります。メソッドシグネチャは保持されます。

構文はルビーのスタブに似ている: [ 6 ]

# RR構文stub ( object ) . method_name { return_value }# 不正な構文stub ( object ) . method_name ( any_args ) { return_value }

フェイクとスタブの主な違いは、フェイクではスタブ前にメソッド呼び出しを検証できるのに対し、スタブではメソッド呼び出しが行われたことを確認するために事前にスタブする必要があることです。

安全なモック

モックはオブジェクトを単独でテストするために使用されます。これは、オブジェクトとその連携オブジェクト間の適切な通信があるかどうかを確認するのに役立ちます。モックは、モック対象のオブジェクトとメソッドが存在する必要があるという点で、スタブのようなものです

構文: [ 7 ]

mock (オブジェクト) .メソッド名( *引数) {戻り値}

スパイ

コードをテストする際、メッセージの送受信は重要な要素です。これはスパイを使って検証されます。スパイは、理想的なケースで何が起こる必要があるかを指定するために使用されます。スパイは、メソッドをスタブする前に、メソッドが呼び出されることを確認します

引数マッチャー

引数マッチャーは、渡される引数の詳細よりも、メソッドが呼び出されるかどうかを知ることが重要である場合に役立ちます。実際の引数の代わりに、ワイルドカードエントリ正規表現などのマッチャーを使用できます。[ 8 ] [ 9 ]

設定オプション

不正な設定構文:[ 10 ]

です。configure do | c |c .search_modules = [オブジェクト]c . fake_ar_attributes = true終了

Search_modules

デフォルトでは、Bogusは名前空間を維持しません。そのため、特定のクラスの検索(クラス名を解決するため)中は、すべての識別子に対して検索が実行されます。検索空間を絞り込むために、Search_modulesをカスタマイズして、特定のクラスのモジュールを含めることができます。例:[ 11 ]

不正です。configure do | c | c .search_modules <<バーエンド

ここで、「Bar」は、検索を実行する必要があるクラスのセットを含むモジュールです。

偽のarモジュール

この機能はActiveRecord::Base [ 12 ]クラスを扱います。ここで、Active Recordはモジュールであり、Baseはそのクラスの1つです。Active Recordの属性は明示的ではありません。それらの変更はデータベースで直接行われます。Baseクラスは、対応するメソッドを持ちますが、自身のメソッドとして明示的には言及されない特別なクラスです。そのため、そのようなメソッドが偽装された場合、そのクラスにはメソッドが存在しないというエラーが発生します。例えば、[ 13 ]

class BlogPost < ActiveRecord :: Base end blog_post = BlogPost . new blog_post . respond_to? ( :name ) # => true blog_post . method ( :name ) # NameError が発生します

この問題を回避するには、fake_ar_modules を true に設定します。そうすることで、エラーなしでフェイクモジュールを作成できます。

RSpec モック vs 偽物

Bogus はユニットテスト中にオブジェクトを分離します。つまり、テスト対象オブジェクトのメソッドに関係するクラスやオブジェクトの情報は一切必要としません。一方、Rspec Mocks はテスト対象オブジェクトで使用されるオブジェクトに関する追加情報を必要とします。Rspec Mocks よりも Bogus を使用する大きな利点の一つは、Bogus が安全なスタブ機能を提供することです。

バージョン履歴

バージョン ハイライト
0.1.6 Rubinius、RSpec 3 の使用に関するテストをクリア
0.1.5 マッチャーの追加、機能の改良
0.1.4 コードの再編成、フェイクの改善、MiniTestコントラクトのサポート
0.1.3 MiniTestのサポート
0.1.2 RSpecの警告 を削除しました
0.1.1 RubiniusJRubyのサポート
0.1.0 Ruby 2.0、フェイクのスタブ、スパイ機能の強化をサポート
0.0.4 改良されたモック
0.0.3 グローバルフェイク、改良されたスタブ構文
0.0.2 匿名フェイク、改良されたスタブメソッド呼び出し
0.0.1 偽物、スタブ、モック、スパイ

参考文献

出典