SpecFlowのようなBDDフレームワークは、技術チームのメンバーがプロジェクトの非技術的な利害関係者とより簡単に通信できるように設計されています。
英語の仕様は、保守やリファクタリングが簡単ではありません。ユニットレベルのテストや例を読むのは技術的でコードを読むことができる人だけなので、私はそのレベルでNUnitなどのユニットテストフレームワークを使用することを好みます。
多くの場合、シナリオは単体テストよりもはるかに複雑です。通常、それらは内部ビジネスロジックのいくつかの組み合わせをカバーしており、組み合わせを構成する各側面は、異なるコード単位の責任になります。したがって、シナリオのロジックはいくつかの異なる単体テストに分割され、それらをコピーすることはできません。
時々、シナリオを使用して単体テストをガイドします。少しのロジックが特定のコードユニットの責任になることに気付くかもしれません。そうすれば、シナリオから関連するステップだけをコメントとしてユニットテストにコピーできます。
// Given I have $100 in my account
var account = new Mock<Account>();
account.SetupGet(a => a.Balance).Returns(100);
var accountProvider = new Mock<AccountProvider>();
accountProvider.Setup(ap => ap.AccountFor("lunivore")).Returns(account);
// When I ask for $20
var atm = new ATM(accountProvider);
atm.PutInCardFor("lunivore");
int money = atm.RequestMoney(20);
// Then I should get $20
Assert.AreEqual(20, money);
// And my account should have paid out $20
account.verify(a => a.PayOut(20));
シナリオが書かれている言語をコピーすることをお勧めします(例:) PayOut
。これは、ドメイン駆動設計の「ユビキタス言語」と一致しています。その言語を単体テストとコードの両方に取り入れることは、翻訳を何度も行う必要がないため、チームが利害関係者と会話するのにも役立ちます。
Gived / When / Thenをコメントに入れることは、すべてのエッジケースを推測しようとするのではなく、実際に使用されるコードの配信に集中するのにも役立ちます。最高品質のコードは、あなたが書かないものです。
幸運を!