我認爲,如果你在你的代碼中的一些輸入錯誤,因爲你的界面被稱爲IAccountService
而你的服務實現IService
。你的班級名爲AccountObj
,而你的構造函數名爲AccountInfo
。
因此,讓我們假設您的服務預計實施IAccountService
,並且您的班級預計名爲AccountInfo
。
在編寫單元測試以測試AccountInfo.RefreshAmount
時,您必須瞭解此功能的要求;你必須確切知道這個函數應該做什麼。
看代碼似乎的RefreshAmount
的要求是:
無論實現IAccountService
和任何標識用於構建AccountInfo
類的對象對象,調用RefreshAmount
的後置條件是財產Amount
返回與IAccountService.GetAccountAmount(Id)
相同的值。
或者更正式的:
- 對於任何標識
- 爲應調用RefreshAmount(後實現
IAccountService
- 正在使用Id和IAccountService創建的對象的任何類),返回一個值對於財產金額,等於由IAccountService.GetAccountAmount(Id)返回的值。
因爲要求說它應該適用於所有的ID和所有的AccountServices,所以你不能用所有的ID來測試你的課程。在編寫單元測試的這種情況下,你必須考慮可能發生的錯誤。
在你的例子中,它看起來沒有可能的錯誤,但是對於將來的版本,你可能會想到該函數會用不正確的ID調用服務,或者調用不正確的服務,或者忘記保存返回值財產金額或該財產金額不會返回正確的值。
您的類的要求指定它應該適用於每個Id和每個IAcocuntService。因此,您可以自由地向要測試的測試對象的構造函數提供任何Id和AccountService,這些可能會檢測到四個未來錯誤中的任何一個。
幸運的是一個簡單的AccountInfo類就足夠
class AccountService : IAccountService
{
public double GetAccountAmount(int accountId)
{
return 137 * accountId - 472;
}
}
以下單元測試的測試,該量是由提供的實現IAccountService的幾個IDS返回
空隙TestAccountObj_RefreshAmount() { 量const int Id = 438; IAccountService accountService = new AccountService(); var testObject = new AccountInfo(Id,accountService);
testObject.RefreshAmount();
double amount = testObject.Amount;
double expectedAmount = accountService.GetAccountAmount(Id);
Assert.AreEqual(expectedAmount, amount);
}
此測試將測試所有四個提到可能的錯誤。它不會找到的唯一的錯誤是,如果這個不正確的服務將返回完全相同的奇怪計算的數字,它會調用不正確的服務。這就是爲什麼我把這種奇怪的計算放在服務中,任何不正確調用的服務都不可能返回相同的錯誤。特別是如果你用不同的Ids測試使用各種TestObject
測試接口本身感覺沒有意義,因爲沒有要測試的實現。 1.編寫一個實現並用單元測試進行測試 2.正如你所提到的,你可以使用Moq來爲你的接口提供一個測試實現 –
@ J.Tuc我不認爲他想測試這個接口, AccountObj'使用該接口。 –
您的'AccountObj'看起來像一個實體。您應該[不要將依賴關係注入到實體的構造函數中](https://stackoverflow.com/a/28767898/264697)。 – Steven