編集:私自身の正気のために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 が特定のタイプの場合にエラー メッセージを表示する単純なコードが存在する可能性があります。