2010-08-03 40 views
1

我试图让我的头脑围绕测试功能和最大限度地减少断言的想法。单元测试服务方法 - 如何声明

所以可以说我有这样的服务方法:

public void TransferFunds(int debitedId, int creditedId, Sum funds) 
{ 
    Account debited = accountRepository.Get(debitedId); 
    Account credited = accountRepository.Get(creditedId); 
    debited.Debit(Sum); 
    credited.Credit(Sum); 
    accountRepository.Update(debited); 
    accountRepository.Update(credited); 
} 

我的单元测试,我相信这时应一分为二,测试一个账户的计入和其他的借记。但是,我是否应该在每个帐户当前状态上进行断言,以验证总和是否已被添加/扣除 - 或者这是对我的帐户模型的测试?如果是这样,我应该断言什么?该更新被称为?这不验证功能...

任何人有一个想法?

回答

1

如果测试的结果(即最终的余额),那么你也有效地测试帐号的对象,这是不是在这里测试,所以你应该尽量避免,如果可能的。

在这种情况下,我希望帐户是哪个,你可以模拟出一个接口。我不确定你使用的语言(看起来像是C#)。在Java中,我会用接口和jMock来做到这一点。

然后,你断言的TransferFunds方法调用借记与右边帐户的权利和,在右边帐户的权利总和调用信用。您还需要模拟出您的帐户资料库,让你的模拟框架响应返回你的模拟帐户来AccountRepository.Get

+0

Danny- 感谢您的及时答复! 所以你看到它的方式将只有2个断言: debited.AssertWasCalled(x => x.Debit(sum)); credited.AssertWasCalled(x => x.Credit(sum)); 对accountRepository没有断言(accountRepository.AssertWasCalled(r => r.Update(credited));或对于此事的借方) 是的,这很有道理:) 谢谢! – nieve 2010-08-03 09:30:30

+0

正如我所说,我不熟悉您使用的语言或框架,但在Java/jMock中,我会执行以下操作: *制作两个模拟帐户 *制作一个模拟AccountRepository *“允许” AccountRepository在请求时用正确的ID返回账户(我不会“要求”这个,因为它不是我们试图测试的功能) *声明在第一个账户上使用正确的Sum *声明Credit方法在第二个账户上以正确的总和 – dty 2010-08-03 12:00:13