我已經閱讀了更多關於單元測試的內容,並決定讓它工作。我挖掘出一個使用存儲庫模式,依賴注入和EF使用ASP.NET MVC編寫的項目。我的第一個任務是單元測試一個控制器。這裏是一個片段從控制器到測試:單元測試現有的ASP.NET MVC控制器
IUserRepository _userRepository;
IAttachmentRepository _attachmentRepository;
IPeopleRepository _peopleRepository;
ICountryRepository _countryRepository;
public UserController(IUserRepository userRepo, IAttachmentRepository attachRepo, IPeopleRepository peopleRepo, ICountryRepository countryRepo)
{
_userRepository = userRepo;
_attachmentRepository = attachRepo;
_peopleRepository = peopleRepo;
_countryRepository = countryRepo;
}
public ActionResult Details()
{
UserDetailsModel model = new UserDetailsModel();
foreach (var doc in _attachmentRepository.GetPersonAttachments(Globals.UserID))
{
DocumentItemModel item = new DocumentItemModel();
item.AttachmentID = doc.ID;
item.DocumentIcon = AttachmentHelper.GetIconFromFileName(doc.StoragePath);
item.DocumentName = doc.DocumentName;
item.UploadedBy = string.Format("{0} {1}", doc.Forename, doc.Surname);
item.Version = doc.VersionID;
model.Documents.Add(item);
}
var person = _peopleRepository.GetPerson();
var address = _peopleRepository.GetAddress();
model.PersonModel.DateOfBirth = person.DateOfBirth;
model.PersonModel.Forename = person.Forename;
model.PersonModel.Surname = person.Surname;
model.PersonModel.Title = person.Title;
model.AddressModel.AddressLine1 = address.AddressLine1;
model.AddressModel.AddressLine2 = address.AddressLine2;
model.AddressModel.City = address.City;
model.AddressModel.County = address.County;
model.AddressModel.Postcode = address.Postcode;
model.AddressModel.Telephone = address.Telephone;
model.DocumentModel.EntityType = 1;
model.DocumentModel.ID = Globals.UserID;
model.DocumentModel.NewFile = true;
var countries = _countryRepository.GetCountries();
model.AddressModel.Countries = countries.ToSelectListItem(1, c => c.ID, c => c.CountryName, c => c.CountryName, c => c.ID.ToString());
return View(model);
}
我要測試的詳細方法,並具有以下查詢:
1)Globals.UserID屬性檢索從會話對象中的當前用戶。我如何輕鬆地測試這個(我使用內置的VS2010單元測試和Moq)
2)我在這裏調用AttachmentHelper.GetIconFromFileName(),它只是查看文件的擴展名並顯示一個圖標。我還在附件存儲庫中調用GetPersonAttachments,調用GetPerson,GetAddress和GetCountries以及調用創建的擴展方法將List轉換爲SelectListItem的IEnumerable。
這個控制器的行爲是一個壞習慣的例子嗎?它使用了大量的存儲庫和其他輔助方法。從我所看到的,單元測試這個單一動作將需要大量的代碼。這反效果嗎?
在一個測試項目中測試一個簡單的控制器的單元是一回事,但是當你進入像這樣的真實代碼時,它可能變成一個怪物。
我想我的問題真的是我應該重構我的代碼,以便更容易測試,或者我的測試變得更復雜,以滿足當前的代碼?
你有沒有考慮過任何的Mapping框架,如Glue,AutoMapper,EmitMapper?對於這種特殊情況,我會盡量不採用單元測試,而是採用SpecFlow等功能測試。 – amdmax
此外,單元測試應該在您編寫項目代碼*時完成*。整個觀點是測試有助於推動設計。試圖在事實失敗後嘗試應用測試。 –