私は単体テストについてますます読んでおり、それを機能させることにしました。リポジトリ パターン、依存性注入、および EF を使用して、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);
}
Details メソッドをテストし、次のクエリを実行したいと考えています。
1) Globals.UserID プロパティは、セッション オブジェクトから現在のユーザーを取得します。これを簡単にテストするにはどうすればよいですか (組み込みの VS2010 単体テストと Moq を使用しています)
2) ここで AttachmentHelper.GetIconFromFileName() を呼び出しています。これは単にファイルの拡張子を調べてアイコンを表示するだけです。また、添付ファイル リポジトリで GetPersonAttachments を呼び出し、GetPerson、GetAddress、および GetCountries を呼び出し、作成された拡張メソッドを呼び出して、List を SelectListItem の IEnumerable に変換します。
このコントローラーのアクションは悪い習慣の例ですか? 多くのリポジトリと他のヘルパー メソッドを使用しています。私が見る限り、この単一のアクションの単体テストには、非常に多くのコードが必要です。これは逆効果ですか?
テスト プロジェクトで単純なコントローラーを単体テストすることは 1 つのことですが、このような実際のコードに入ると、モンスターになる可能性があります。
私の質問は、テストを容易にするためにコードをリファクタリングする必要があるか、それとも現在のコードを満たすためにテストをより複雑にする必要があるかということだと思います。