Objective-C を使用していると仮定します。Objective-C の場合、 OCMockはモック/単体テストに広く使用されています (2 番目のオプション)。
最後に OCMock を使用したのは 1 年以上前ですが、私が覚えている限り、これは本格的なモッキング フレームワークであり、以下で説明するすべてのことを実行できます。
モックに関する重要な点の 1 つは、オブジェクトの実際の機能を最大限に活用できることです。「空の」モック (すべてのメソッドがオブジェクトになりますが、何もしません) を作成し、テストで必要なメソッドだけをオーバーライドできます。これは通常、モックに依存する他のオブジェクトをテストするときに行われます。
または、実際のオブジェクトの動作として機能するモックを作成し、そのレベルでテストしたくないいくつかのメソッド (たとえば、実際にデータベースにアクセスするメソッド、ネットワーク接続を必要とするメソッドなど) をスタブ化することもできます。これは通常、モックされたオブジェクト自体をテストするときに行われます。
一度だけモックを作成するわけではないことを理解することが重要です。すべてのテストは、テスト対象に基づいて、同じオブジェクトのモックを新たに作成できます。
モックに関するもう 1 つの重要な点は、シナリオ (一連の呼び出し) とそれらについての「期待」 (舞台裏でどのメソッドをどのパラメーターでどの順序で呼び出すか) を「記録」してから、「再生」できることです。シナリオ - 期待が満たされない場合、テストは失敗します。これが、クラシック TDD とモックスト TDD の主な違いです。これには長所と短所があります (Martin Fowler の記事を参照)。
具体的な例を考えてみましょう (Objective C ではなく、C++ または Java に似た疑似構文を使用します)。
LoginForm
入力されたログイン情報を表すクラスのオブジェクトがあるとします。(とりわけ) setName(String)
、setPassword(String)
、bool authenticateUser()
、および のメソッドがありAuthenticator* getAuthenticator()
ます。
Authenticator
また、 (とりわけ)メソッドbool isRegistered(String user)
、bool authenticate(String user, String password)
、およびを持つクラスのオブジェクトもありますbool isAuthenticated(String user)
。
簡単なシナリオをテストする方法は次のとおりです。
MockLoginForm
上記の 4 つを除くすべてのメソッドを空にしてモックを作成します。最初の 3 つの方法は、実際のLoginForm
実装を使用します。getAuthenticator()
を返すためにスタブアウトされMockAuthenticator
ます。
MockAuthenticator
偽のデータベース (内部データ構造やファイルなど) を使用して 3 つのメソッドを実装するモックを作成します。データベースにはタプルが 1 つだけ含まれます: ('rightuser','rightpassword')
.
TestUserNotRegistered
リプレイ シナリオ:
MockLoginForm.setName('wronuser');
MockLoginForm.setPassword('foo');
MockLoginForm.authenticate();
期待:
getAuthenticator() is called
MockAuthenticator.isRegistered('wrognuser') is called and returns 'false'
テスト間違ったパスワード
リプレイ シナリオ:
MockLoginForm.setName('rightuser');
MockLoginForm.setPassword('foo');
MockLoginForm.authenticate();
期待:
getAuthenticator() is called
MockAuthenticator.isRegistered('rightuser') is called and returns 'true'
MockAuthenticator.authenticate('rightuser','foo') is called and returns 'false'
テストログインOK
リプレイ シナリオ:
MockLoginForm.setName('rightuser');
MockLoginForm.setPassword('rightpassword');
MockLoginForm.authenticate();
result = MockAuthenticator.isAuthenticated('rightuser')
期待:
getAuthenticator() is called
MockAuthenticator.isRegistered('rightuser') is called and returns 'true'
MockAuthenticator.authenticate('rightuser','rightpassword') is called and returns 'true'
result is 'true'
これが役立つことを願っています。