赋予单元测试以个性

时间:2020-03-06 15:00:29  来源:igfitidea点击:

我一直在思考单元测试以及如何提高单元测试的可读性。我想为什么不给单元测试中的类一个字符以阐明它们的作用。

这是我编写的一个简单的单元测试:

[TestFixture]
    public class when_dave_transfers_money_from_wamu_account_to_the_woodforest_account 
    {
        [Test]
        public void should_increase_the_amount_in_woodforest_account_when_transaction_successfull()
        {
            Dave dave = new Dave();

            Wamu wamu = new Wamu();
            wamu.Balance = 150; 

            wamu.AddUser(dave);

            Woodforest woodforest = new Woodforest();
            woodforest.AddUser(dave);

            FundTransferService.Transfer(100, wamu, woodforest);

            Assert.AreEqual(wamu.Balance, 50); 
            Assert.AreEqual(woodforest.Balance, 100); 
        }
}

这是Dave类:

/// <summary>
    /// This is Dave!
    /// </summary>
    public class Dave : User
    {      
        public Dave()
        {
            FirstName = "Dave";
            LastName = "Allen";            
        }

    }

单元测试名称明确地达到了目的。但是,也许我想更深入地挖掘,并在创建Dave时将Wamu和Woodforest帐户分配给Dave。问题在于它将不再具有可读性,因为我将不得不使用索引值来引用该帐户。

我们对如何使其更具可读性有何想法​​?

解决方案

测试夹具中的私有助手方法怎么样

private Dave GetDave_With_Wamu_And_Woodforest_AccountsHookedUp()

创建Dave时,可以将Dave添加到Wamu和Woodforest帐户中,如下所示:

public Dave()
        {
            FirstName = "Dave";
            LastName = "Allen"; 

            // add accounts for Dave 

            Wamu wamu = new Wamu();
            wamu.AddUser(this);

            Woodforest woodforest = new Woodforest();
            woodforest.AddUser(this); 
        }

帐户被添加到Dave继承的User对象中的List集合中。

当我们尝试实例化Wamu实例时,它不应该抛出WamuNotFoundException吗?

这是运行测试的另一种方法:

[Test]
        public void should_increase_the_amount_in_woodforest_account_when_transaction_successfull()
        {
            Dave dave = new Dave();

            // we know that dave has wamu and wooforest accounts 

            dave.WamuAccount("Wamu").Balance = 150;

            FundTransferService.Transfer(100, dave.WamuAccount("Wamu"), dave.WoodforestAccount(
                "Woodforest"));

            Assert.AreEqual(50, dave.WamuAccount("Wamu").Balance);
            Assert.AreEqual(100, dave.WoodforestAccount("Woodforest").Balance);             
        }