NUnit快速入门(二)

让我们来为我们的 Account 的代码添加一些错误检测。为账户添加一个最小余额限制,通过你的最小透支保护费来维持它的持续运作。首先我们来为 Account 类添加一个最小余额保护属性:

private float minimumBalance = 10.00F ;

public float MinimumBalance

{

get { return minimumBalance;}

}

我们使用一个异常来指出透支:

namespace bank

{

using System;

public class InsufficientFundsException : ApplicationException

{

}

}

向我们的 AccountTest 类添加一个新的方法:

[Test]

[ExpectedException( typeof (InsufficientFundsException))]

public void TransferWithInsufficientFunds()

{

Account source = new Account();

source.Deposit( 200.00F );

Account destination = new Account();

destination.Deposit( 150.00F );

source.TransferFunds(destination, 300.00F );

}

这个测试方法除了 [Test] 特性之外还关联了一个 [ExpectedException] 特性——这指出测试代码希望抛出一个指定类型的异常;如果在执行过程中没有抛出这样的一个异常——该测试将会失败。编译你的代码并回到 GUI 。由于你编译了你的测试代码, GUI 会变灰并重构了测试树,好像这个测试还没有被运行过( GUI 可以监视测试程序集的变化,并在测试树结构发生变化时进行更新——例如,添加了新的测试)。点击“ Run ”按钮——我们又一次得到了一个红色的状态条。我们得到了下面的失败消息:“ TransferWithInsufficentFunds: InsufficientFundsException was expected ”。我们来再次修改 Account 的代码,象下面这样修改 TransferFunds 方法:

public void TransferFunds(Account destination, float amount)

{

destination.Deposit(amount);

if (balance-amount

1<minimumbalance) $450.00="" (balance-amount<minimumbalance)="" (insufficientfundsexception="" );="" ,="" ,destination.balance);="" ,source.balance);="" 100.00f="" 150.00="" 150.00f="" 200.00f="" 250.00f="" 300="" 300.00f="" [expectedexception(typeof(insufficientfundsexception))]="" [ignore("need="" [setup]="" [test,="" [test]="" [testfixture]="" account="" account();="" accounttest="" amount)="" application")]="" assert.areequal(="" bank="" bank.accounttest.transferwithinsufficientfundsatomicity()="" catch="" catch(insufficientfundsexception="" class="" code="" decide="" destination="new" destination,="" destination.balance);="" destination.deposit(="" destination.deposit(amount);="" destination;="" expected)="" float="" how="" if="" ignore("need="" implement="" in="" init()="" insufficientfundsexception();="" is="" management="" namespace="" new="" not="" nunit.framework;="" public="" run="" same="" setup="" source="new" source.balance);="" source.deposit(="" source.transferfunds(destination,="" source;="" system;="" test="" the="" throw="" to="" transaction="" transferfunds()="" transferfunds(account="" transferwithinsufficientfunds()="" transferwithinsufficientfundsatomicity()="" try="" using="" v2.1,可以在="" void="" withdraw()="" withdraw(amount);="" {="" }="" ”选项卡,你会看到="" 。我们该如何修改?我们能够只将最小余额检查的调用放到数据更新的前面么:="" 块中执行一个补救处理,还是依赖我们的交易管理器来重新装载对象的状态?某些时候我们必须回答这样的问题,但不是现在;可我们眼前如何应付这个失败的测试呢——删除它?一个不错的方法是临时忽略它在你的测试方法中添加下面的特性:="" 块钱——="" 如果="" 如果你安装了nunit="" 开始-="" 我们测试了方法的交易属性——是否所有的操作都成功了。编译并运行——红条。是的,我们平白无故地损失了="" 方法中并在所有的测试中重用它们。我们的测试类的重构版本像下面这样:="" 方法抛出了另外一个异常呢?我们应该在="" 注意这个初始化方法拥有通用的初始化代码,它的返回值类型为="" 特性标记。编译并运行——同样的黄条!="全文完==========" 看看我们的测试代码,我们可以看到一些适宜的重构。所有的方法共享一组公共的测试对象。让我们来将这些初始化代码放到一个="" 编译并运行——黄条。单击“="" 编译并运行测试——绿了。成功!不过等等,看看我们刚写的代码,我们会发现银行在每一笔不成功的转账操作时都亏钱了。让我们来写一个测试来确认我们的猜测。添加这个测试方法:="" 账户显示:="" 账户有正确的余额="" 连同这个测试被忽略的原因一起列在列表中。="" ,但="" ,没有参数,并且由="">程序-&gt;NUnit V2.1-&gt;QuickStart 处得到原文(英文版)。</minimumbalance)>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus