Template wygląda następująco:
[Category("BDD_MySuperClass")] public class when_we_run_special_methods : InstanceSpecification<MySuperClass> { protected override MySuperClass Create_subject_under_test() { return new MySuperClass(); } [Test] public void It_should_do_special_stuff() { } }
Cała magia jest w dwóch klasach abstrakcyjnych:
public abstract class Specification { [SetUp] public virtual void BaseSetUp() {} [TearDown] public virtual void BaseTearDown() {} [DebuggerStepThrough] protected virtual void Establish_context() {} [DebuggerStepThrough] protected virtual void Because() {} [DebuggerStepThrough] protected virtual void Dispose_context() {} [DebuggerStepThrough] protected virtual void Initialize_subject_under_test() {} }
I druga generyczna klasa:
public abstract class InstanceSpecification<TSubjectUnderTest> : Specification { protected TSubjectUnderTest SubjectUnderTest { get; private set; } protected abstract TSubjectUnderTest Create_subject_under_test(); public override void BaseSetUp() { Establish_context(); Initialize_subject_under_test(); Because(); } public override void BaseTearDown() { Dispose_context(); } protected override void Initialize_subject_under_test() { SubjectUnderTest = Create_subject_under_test(); } }
'Super' przykład dla StringBuilder jest przedstawiony poniżej:
[Category("BDD_StringBuilder")] [TestFixture] public class when_we_insert_char_into_empty_stringBuilder : InstanceSpecification<StringBuilder> { public string SubjectUnderTestString { get { return SubjectUnderTest.ToString(); } } protected override StringBuilder Create_subject_under_test() { return new StringBuilder(); } protected override void Because() { SubjectUnderTest.Insert(0, "first word"); } [Test] public void It_should_start_with_word_first() { Assert.IsTrue(SubjectUnderTestString.StartsWith("first")); } [Test] public void It_should_not_be_empty_string_because_words_ware_added() { Assert.NotNull(SubjectUnderTest); Assert.IsTrue(SubjectUnderTestString.Any()); //any char } }
SubjectUnderTestString to pole pomocnicze. Przykład przedstawia wzorzec AAA (Arrange-Act-Assert). Metoda Create_subject_under_test() przygotowuje obiekt, metoda Because() wykonuje pewne zachowania na tym obiekcie i mamy dwie metody testowe.
Więcej szczegółów o testowaniu w stylu BDD możesz zaleź na elegantcode.com. Możesz pobrać code snippet z MyCodeSnippets.
Brak komentarzy:
Prześlij komentarz