2010-08-03 71 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