しいただいてもかまいませんの模擬?
-
09-06-2019 - |
質問
いての基礎的な理解を模擬し、偽物がなんなのか思い場合は使用嘲笑う、特にとしていることにシナリオ こちらの.
解決
ユニットテストで試験を単一のcodepathにより、単一の方法です。場合の実行方法をパス外の方法は、別のオブジェクトしてもらうことを目的として、依存性がある。
テストするときにはそのパスコードの依存関係はありませんユニット試験;おいて統合。ながら静な状態が心の本来の姿であると、必要なユニットテスト。
ご依存性はバギー試験の影響を受けないようにfalseを返します。例えば、パスに依存関係の予期せぬnullの場合は、依存関係がない例としてnullでが記載されています。お試しないenounterにnull引数として例外では、試験ます。
また、なる場合があり、なければ確実に取得する依存のオブジェクトを返しいただけたらと思ってい期間中はスノーボードスクール。るものを投げ予定の例外を内試験までを実施。
モックに置き換える関係である。設定した期待に依存オブジェクトの正確な戻り値のできる試験を実施するただし、例外をスローできるように試験をお取り扱いの例外コードです。このようにできる試験のユニットの質問です。
TL;DR:模擬毎依存関係のお部試験チ。
他のヒント
模擬物有したいとき 試験の相互作用 間のクラスの試験と特定のインタフェース。
例えば、しい試験方法 sendInvitations(MailServer mailServer)
電話 MailServer.createMessage()
正確には、一度も電話 MailServer.sendMessage(m)
か、他のメソッド呼び出されるの MailServer
インタフェース。ことができた場合には、利用模擬オブジェクト。
と模擬物の代わりにパリ MailServerImpl
, や試験 TestMailServer
, を通過できる模擬実施の MailServer
インタフェース。前を通ってモック MailServer
, した"鉄道"で、何をメソッドの呼び出しを期待し、何の戻り値を返します。最後に、模擬オブジェクトを主張するすべての予定の方法として期待される。
この音の良さでもありマイナス面.
模擬欠陥
また模擬一体で改善に取り組み、誘惑の利用模擬オブジェクト 毎回 渡す必要がありまインターフェースのクラスのテストです。この方法だと思います 試験の相互作用しない場合でも必要.残念ながら不要な(偶然)試験の相互作用が悪いのでしませることにより、特定の要件の実施において特定の方法で、それよりも、この実施に必要な結果です。
この例では擬似コード.そういった作 MySorter
クラスのための試験で
// the correct way of testing
testSort() {
testList = [1, 7, 3, 8, 2]
MySorter.sort(testList)
assert testList equals [1, 2, 3, 7, 8]
}
// incorrect, testing implementation
testSort() {
testList = [1, 7, 3, 8, 2]
MySorter.sort(testList)
assert that compare(1, 2) was called once
assert that compare(1, 3) was not called
assert that compare(2, 3) was called once
....
}
(この例では想定していましたことのある特定のソートアルゴリズムなど、クイックソート、また試験その場合は、後者には、試験という有効になります。)
にそのような極端な例ではなぜ、後者の例は間違っています。時を変更して実施 MySorter
, 最初の試験はどのくして並べ替えが正しく、全ての試験もできる変更をコードす。一方、後者試験 常に 休憩時間にも積極的に有害;が妨げリファクタリング.
疑似としてスタブ
模擬枠組み多きも小さいという厳しい使用しない指定はいつどのよう多くの方法"というパラメータの予想されるすことができることを模擬オブジェクトとして使用され スタブ.
しようとしている方法 sendInvitations(PdfFormatter pdfFormatter, MailServer mailServer)
ていきたいという。の PdfFormatter
オブジェクトを作成するのに使用されます。この試験:
testInvitations() {
// train as stub
pdfFormatter = create mock of PdfFormatter
let pdfFormatter.getCanvasWidth() returns 100
let pdfFormatter.getCanvasHeight() returns 300
let pdfFormatter.addText(x, y, text) returns true
let pdfFormatter.drawLine(line) does nothing
// train as mock
mailServer = create mock of MailServer
expect mailServer.sendMail() called exactly once
// do the test
sendInvitations(pdfFormatter, mailServer)
assert that all pdfFormatter expectations are met
assert that all mailServer expectations are met
}
この例では、はしていませんの PdfFormatter
オブジェクトまで電車で静かに受け付け呼び戻す一部の顕缶戻り値はすべての方法 sendInvitation()
う呼びます。かったってこのリストの方法です。そして、あらかじめ取り決めた走りは、試験および保管の方法では、試験経過しました。更に、研修を実施したのはスタブへの対応方法な手がかりのはなぜでそれを呼び出すように、そして、あらかじめ取り決めた追加の試験を訴えます。また、試験ます。
もうその後、変更いたしました sendInvitations()
, 又はその他のクラス sendInvitations()
用を足pdf?当社のテストが突然失敗したのでその方法 PdfFormatter
と呼ばれる想像力と創造力を掻き立の列車たちのスタブを期待します。通常では一つの試験に失敗した状況で、このようなので他の試験に使用、直接または間接的に、 sendInvitations()
方法。て修正すべての試験による疑問を抱いたと指摘している。また、通知までは除去できない方法なので、わからないとかなければならないかは必要ありません。また、妨げリファクタリング.
また、読みやすくするための工夫試験被害がものすごく、多くのコードがかったことを書けなかったものの、ほとんど情報がなかったことができますでたいコードである。を使用する試験模擬物を見て非常に複雑ないことが多くを読み込みます。の試験では読者が理解し、どのようにクラスの試験は、このようにうすることから、シンプルかつ簡単です。ていない場合、読みや、誰もが保;とくにそれらを削除するよう維持します。
どのように修正。簡単に:
- 使い方は実際の授業での疑似となりました。利用の実
PdfFormatterImpl
.いない場合は、変更の授業も可能です。ご利用になれなかったことによるクラスの試験に通常ポイントの一部の問題のクラスです。固定に問題がwin-winの状況を固定するクラスとい簡単なテストです。一方、固定で使用疑似ではない-winの状況なんでしょうかを実際のクラスを利用しています。複合体は、読みや試験を阻害する更なるrefactorings. - して新しいアカウントを作成単純な試験を実施インターフェースの代わりに嘲笑うので、それぞれの試験で、この試験クラスのすべての試験までを実施。の作成
TestPdfFormatter
ることは何も行いません。そのように変更することができました全試験は、試験のウエアとの長いトがお客様からもスタブ.
すべての模擬オブジェクトには使用できなく 彼らは多くの促進の悪い習慣、試験実施の詳細を妨げリファクタリングをのコメントを書くためには、維持が難しく試験.
一部の詳細は欠陥の疑似参照 擬似オブジェクト足利用の場合.
経験則:
この機能で試験ニーズは複雑なオブジェクトのパラメータとして、この痛みへの簡単インスタンスを生成がこのオブジェクト(例えばれるパスワード辞書の確立TCP接続を使用する模擬.
すべ模擬オブジェクトが依存単位コードしようとする試験が必要"だけで".
例えば、チャレンジしているうちは試験の一部ロジック部のコードが必要ないから別のオブジェクトから返されたこの依存関係にもたらす影響に何をしようとする試験-模擬するオブジェクトです。
大podcastの話題です こちらの