2010-12-07 75 views
3

我正尝试着手使用纯TDD并考虑BDD风味。我正在努力去掌握,如何使用MSpec编写单元测试与NUnit完全相反。将MSpec测试转换为普通NUnit

考虑一个简单的测试MSpec像下面这样:

[Subject("PersonRepository")] 
class when_adding_a_new_person 
{ 
    Establish context =() => sut = new PersonRepository(); 

    Because of =() => sut.AddPerson("Jim", "Panse"); 

    It should_have_a_person = sut.Count.ShouldEqual(1); 
    It should_have_that_persion = sut.Contains("Jim", "Panse"); 

    static PersonRepository; 
} 

你会如何在一个干净的方式,但不使用任何BDD扩展或任何其转换为NUnit的。我认为这是一个好主意,每个断言都应该是一个单独运行的测试,并且EstablishBecause应该只针对所有断言执行一次。对于EstablishBecause,我可以使用[Setup],但是这将针对每个测试运行。我可以使用Assert.作为It,但这不会使它们单独运行测试。

这个例子与NUnit风格对比如何?

回答

7

我通常会建议不要从MSpec转换到NUnit。在向MSpec介绍人员时,我喜欢从一个“经典”NUnit(PersonRepositoryTester.TestAddNewPerson)夹具开始,将它转换为如下所示的更多BDDish夹具,然后向他们展示MSpec如何帮助减少语言噪音并引入可读性+更好的报告。

[TestFixture] 
public class When_adding_a_new_person 
{ 
    PersonRepository sut; 

    [TestFixtureSetUp] 
    public void Establish_and_because() 
    { 
     sut = new PersonRepository(); 

     sut.AddPerson("Jim", "Panse"); 
    } 

    [Test] 
    public void It_should_have_one_person() 
    { 
     Assert.That(sut.Count, Is.EqualTo(1)); 
    } 

    [Test] 
    public void It_should_contain_the_new_person() 
    { 
     Assert.That(sut.Contains("Jim", "Panse"), Is.True); 
    } 
}