0

編集:私自身の正気のために21/09/12を更新しました...これが質問だったとは信じられません(イェーイ学習)。

コンソール要素は、これで私を少し香りから遠ざけました. 特にメッセージではなく、エラーを確認するだけの場合は、例外をアサートする (期待する) だけで機能する可能性があります。コンソールのアクティビティをログに記録し、ログを確認することはうまくいきます。投稿の最後に詳述されているシステム応答のアイデアは機能していたでしょう。この種のオプションはたくさんあります。トン!私の結論?最も理にかなっている/最も脆くないことは何でもしてください。シナリオがしっかりしていて、行動を証明している限り、それで問題ありません。


私の BDD クエストは、.NET の簡単なコンソール アプリケーション (VS2010、SpecFlow、および NUnit) で続行されます。

私は、次のようなシナリオで何か障害になっています。

Feature: Withdraw Money
Scenario: Insufficient Funds
Given I have a MoneyBox
And my MoneyBox contains £10
When I withdraw £20
Then the system should display an error message
And my MoneyBox should contain £10

コンテキストを定義することは問題ありません。資金を引き出そうとすることは問題ありません。関連する単体テストはすべて問題ありません。最後にバランスを主張しても問題ありません。

次のような .Withdraw() メソッドを実装したいと思います。

//Assume the moneybox only contains £1 coins (hence int is ok)
public void Withdraw(int withdrawlAmount) throws InsufficientFundsException
{
if(this.balance >= withdrawlAmount)
{
this.balance -= withdrawlAmount;
}
else
{
throw new InsufficientFundsException();
}
}

そのコードの単体テストを行うことができます (合格および不合格の条件テストを介して)。

ただし、コンソール アプリのコンテキストでは、次のようにアサートする方法がよくわかりません。

Then the system should display an error message

アイデア、ヒント、参考文献をいただければ幸いです。

編集1:

NB私の質問は、BDD方法論を使用した受け入れテストを介してエラーメッセージを証明することのみに関係しています。文脈の問題のように感じます。再度、感謝します。

編集2:

1 つのアプローチは、シナリオ、またはむしろその実装を再考することです。MoneyBox のコードはそのまま (単体テスト済みで、受け入れテスト済みの純粋な BO ではありません) 書くことができますが、その機能は何らかのコンテキスト クラスでラップすることができます。

超簡単な例:

public class MoneyBoxDriver
{
private MoneyBox objMB
private SystemResponse objSR

//Standard stuff e.g. constructor

private void Withdraw(int withdrawAmount)
{
try
{
objMB.Withdraw(withdrawAmount);
}
catch(InsufficientFundsException)
{
this.objSR = new SystemResponse(SystemResponseEnum.FailedInsufficientFunds);
}
}

次に、MoneyBoxDriver をコンテキストとして設定し、Withdraw ラッパー メソッドを介して操作し、MoneyBoxDriver の SystemResponse をチェックして機能をアサートします。

Then the system should display an insufficient funds error message
...
Assert.That(MBDriver.SystemResponse.Type == SystemResponseEnum.FailedInsufficientFunds)
...

UI (コンソール) には、SystemResponse が特定のタイプの場合にエラー メッセージを表示する単純なコードが存在する可能性があります。

4

1 に答える 1

2

これは、あらゆる種類のテスト ファースト アプローチの楽しみの 1 つです。オブジェクトをテストできるように設計する必要があります。

この例では、次のことを検討します: (次のコードはテストされておらず、「完璧な」ソリューションでもないことに注意してください。ただし、よりテストしやすく、目的に近いものです)。

//Assume the moneybox only contains £1 coins (hence int is ok)
public void Withdraw(int withdrawlAmount, Action<InsufficientFundsException> handleException)
{
     if(this.balance >= withdrawlAmount)
     {
          this.balance -= withdrawlAmount;
     }
     else
     {
          handleException(new InsufficientFundsException());
     }
}

次に、テスト コードに、考えられる例外のフィールドまたはプロパティを含めることができます。Withdraw メソッドを呼び出すときに、コールバックを実行するためのクイック アクションを指定するだけです。

moneyBox.Withdraw(10, e => this.WithdrawException = e);

Thenその後、ステートメントはがnullWithdrawExceptionではなかったことをアサートし、その中のメッセージに対してアサートを行うことができます。

プロダクション コード (つまり、コンソール アプリケーション) は、代わりに次のようにする可能性があります。

moneyBox.Withdraw(10, e => Console.WriteLine("Error: {0}", e.Message));

Action<InsufficientFundsException>より完璧な解決策は、 を のようなものAction<MoneyBoxWithdrawResponse>、または類似のものに置き換えることです。MoneyBoxWithdrawResponse操作の成功に関する情報、おそらく残高、潜在的なエラー/例外の詳細が含まれています。

于 2012-08-14T14:40:10.157 に答える