2016-11-29 99 views
3

我想測試具有以下簽名的方法。嘲笑沒有界面或虛擬方法的課程

int SomeMethod(List<Employee> employees) 

下面是相關的類

public class Employee 
{ 
    public int CustomerID { get; set; } 
    public string LastName { get; set; } 
    public string FirstName { get; set; } 
    public Address Address { get; set; } 

} 

public class Address 
{ 
    public string StreetName { get; set; } 
    public string CityName { get; set; } 
    public string State { get; set; } 
    public string Country { get; set; } 
    public string ZipCode { get; set; } 
} 

我怎麼能嘲笑List<Employee>作爲輸入的someMethod?請注意,員工和地址類沒有界面或虛擬方法。

+2

你的類模型。你爲什麼嘲笑模型?他們沒有任何功能。 – kat1330

+0

你能提供你想測試的測試用例和方法嗎? – kat1330

+0

這是正確的,這些都是模型,但讓我們說SomeMethod有一些我想測試的業務邏輯。這不是一個好的測試場景嗎? –

回答

7

如果要測試以下簽名int SomeMethod(List<Employee> employees)的方法,則不需要模擬Employee

您需要創建List<Employee> employees = new List<Employee>(),傳遞給方法和檢驗結果!

EmployeeAddress是沒有任何功能的模型,您不需要嘲笑它們!

以下是關於你的情況下,兩個想法:

  1. 你可以合法地調用你的方法new Employee()new Address()因爲該代碼是可測試!創建模型的新實例不會執行外部依賴。

  2. 只有在具有功能的情況下才能撥打new Employee()new Address()。在這種情況下,您將執行可能不可測試的真正依賴關係!例如,如果EmployeeAddress與數據庫通信,則它不可測試,因爲它將在執行測試時連接到真實數據庫。比你需要創建模擬以避免數據庫連接。

2

沒有員工和你的模擬對象之間的接口或公共基類,你不能傳遞任何對象,除了員工。

如果有必要,我會建議有能力爲你的員工類&模擬類都實現創建接口。然後,您只需將方法參數更改爲接受接口而不是直接接受Employee。