Main Content

matlab.unittest.constraints.Throws クラス

パッケージ: matlab.unittest.constraints
スーパークラス: matlab.unittest.constraints.Constraint

MException をスローする関数ハンドルを指定する制約

説明

Throws クラスは、実際の値が特定の例外をスローする関数ハンドルである場合のみ満たされる制約を作成します。

関数が MException をスローし、制約の ExpectedException プロパティがエラー識別子である場合、スローされた実際の MException が別の識別子をもっていると、検定エラーが発生します。また、ExpectedException プロパティが meta.class であれば、制約は、スローされた実際の MExceptionExpectedException から派生しない場合に満たされません。

構築

outConstObj = Throws(excep) は、特定の MException である excep をスローする関数ハンドルを指定する制約 outConstObj を提供します。

outConstObj = Throws(excep,Name,Value) は、1 つ以上の Name,Value のペアの引数で指定された追加オプションをもつ制約を提供します。

入力引数

excep

期待される特定のタイプの例外を表すエラー識別子または meta.classexcepmeta.class であるが、MException から派生しない場合、Throws コンストラクターは MException をスローします。

名前と値の引数

引数のオプションのペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後になければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用してそれぞれの名前と値を区切り、Name を引用符で囲みます。

CausedBy

予測される原因。文字ベクトルの cell 配列、string 配列、または meta.class インスタンスの配列として指定します。

CausedBy で指定された原因が原因ツリー内にないと、テストは検定エラーになります。

既定値: {}

WhenNargoutIs

関数ハンドルを呼び出すときに制約が要求しなければならない出力数。非負の実数のスカラー整数として指定します。

既定値: 0

RespectingSet

一連の予測される原因を考慮に入れるかどうかを示すインジケーター。false または true (logical 0 または 1) として指定します。この値が false の場合、インスタンスは追加の原因を無視します。この値が true に設定されている場合、インスタンスは追加の原因に影響されます。true 値は、予測される例外に 'CausedBy' の名前と値のペアで指定されていない原因が含まれている場合、制約が満たされないことを意味します。

既定値: 0

プロパティ

ExpectedException

必要な MException 識別子またはクラス。この読み取り専用プロパティは、入力引数 excep を介してコンストラクターで設定します。

Nargout

関数を実行するときにインスタンスが使用する出力引数の数。このプロパティは、名前と値のペアの引数 'WhenNargoutIs' を介してコンストラクターで設定します。

RequiredCauses

関数ハンドルが MException をスローするための期待される原因。このプロパティは、名前と値のペアの引数 'CausedBy' を介してコンストラクターで設定します。

RespectSet

制約が集合要素を考慮に入れるかどうかを示すインジケーター。名前と値のペアの引数 'RespectingSet' を介してコンストラクターで指定します。

コピーのセマンティクス

ハンドル。コピー操作に対するハンドル クラスの影響については、オブジェクトのコピーを参照してください。

すべて折りたたむ

対話型テスト用にテスト ケースを作成します。

import matlab.unittest.TestCase
import matlab.unittest.constraints.Throws

testCase = TestCase.forInteractiveUse;

関数が指定されたエラー id をスローすることを検証します。

testCase.verifyThat(@() error('SOME:error:id','Error!'), ...
    Throws('SOME:error:id'))
Interactive verification passed.

関数が指定された例外クラスをスローすることを検証します。

testCase.verifyThat(@() error('SOME:error:id','Error!'), ...
    Throws(?MException))
Interactive verification passed.

指定された出力数で呼び出されたときに、関数が指定されたエラーをスローすることを検証します。

testCase.verifyThat(@() disp('hi'), Throws('MATLAB:maxlhs', ...
    'WhenNargoutIs', 1))
Interactive verification passed.

識別子で原因をチェックします。

me = MException('TOP:error:id','TopLevelError!');
causeBy1 = MException('causedBy:someOtherError:id','CausedByError!');
causeBy2 = MException('causedBy:yetAnotherError:id','AnotherCausedByError!');
me  = me.addCause(causeBy1);
me  = me.addCause(causeBy2);

testCase.verifyThat(@() me.throw, Throws('TOP:error:id','CausedBy',...
    {'causedBy:someOtherError:id'}))
Interactive verification passed.

例外に 'CausedBy' で指定されていない追加の原因が含まれていないことをチェックします。

testCase.verifyThat(@() me.throw, Throws('TOP:error:id','CausedBy',...
    {'causedBy:someOtherError:id'},'RespectingSet',true))
Interactive verification failed.

---------------------
Framework Diagnostic:
---------------------
Throws failed.
--> The following causes were unexpectedly found in the exception tree:
    --> 'causedBy:yetAnotherError:id'

Actual Error Report:
    Error using @()me.throw
    TopLevelError!
    
    Caused by:
        CausedByError!
        AnotherCausedByError!
    
Actual Error Structure:
    ?MException 'TOP:error:id'
    --> ?MException 'causedBy:someOtherError:id'
    --> ?MException 'causedBy:yetAnotherError:id'

Evaluated Function:
        @()me.throw

クラスで原因をチェックします。

me = MException('TOP:error:id','TopLevelError!');
causeBy = MException('causedBy:someOtherError:id','CausedByError!');
me = me.addCause(causeBy);
testCase.verifyThat(@() me.throw, Throws('TOP:error:id','CausedBy', ...
    ?MException))
Interactive verification passed.

実際の値が関数ハンドルでない場合に制約が満たされないことを検証します。

testCase.fatalAssertThat(5, Throws('some:id'))
Interactive fatal assertion failed.

---------------------
Framework Diagnostic:
---------------------
Throws failed.
--> The value must be an instance of the expected type.
    
    Actual Class:
        double
    Expected Type:
        function_handle

Actual Value:
         5
Fatal assertion failed.

関数が例外をスローしない場合に制約が満たされないことを検証します。

testCase.assumeThat(@rand, Throws(?MException))
Interactive assumption failed.

---------------------
Framework Diagnostic:
---------------------
Throws failed.
--> The function did not throw any exception.
    
    Expected Exception:
        --> ?MException

Evaluated Function:
        @rand
Assumption failed.

関数が未指定のエラー識別子を発行する場合に制約が満たされないことを検証します。

testCase.verifyThat(@() error('SOME:id','Error!'), Throws('OTHER:id'))
Interactive verification failed.

---------------------
Framework Diagnostic:
---------------------
Throws failed.
--> The function threw the wrong exception.
    
    Actual Exception:
        'SOME:id'
    Expected Exception:
        'OTHER:id'

Actual Error Report:
    Error using @()error('SOME:id','Error!')
    Error!
    
Evaluated Function:
        @()error('SOME:id','Error!')

関数が例外をスローしたときの原因が指定の識別子と一致しない場合に制約が満たされないことを検証します。

testCase.verifyThat(@() error('TOP:error:id','TopLevelError!'), ...
    Throws('TOP:error:id','CausedBy',{'causedBy:someOtherError:id'}))
Interactive verification failed.

---------------------
Framework Diagnostic:
---------------------
Throws failed.
--> The following causes were not found in the exception tree:
    --> 'causedBy:someOtherError:id'

Actual Error Report:
    Error using @()error('TOP:error:id','TopLevelError!')
    TopLevelError!
    
Actual Error Structure:
    ?MException 'TOP:error:id'

Evaluated Function:
        @()error('TOP:error:id','TopLevelError!')

バージョン履歴

R2013a で導入