下面是一個帶Post方法的控制器。如何在不保存更改到數據庫的情況下針對CREATE方法編寫單元測試?您如何使用EF SaveChanges對MVC控制器進行單元測試
我想寫反對我的控制器檢測,這樣,當其他開發商更改也不會破壞我的功能的代碼(我有功能上的創建方法,一點點地保持簡單現在)。
public class AdministratorController : Controller
{
private IUnitOfWork _uow;
[HttpPost]
public ActionResult Create(MyModel model)
{
ViewBag.id = model.Id;
if (model.FirstName == model.LastName)
{
ModelState.AddModelError("", "Cannot have same first name and last name.");
}
if (ModelState.IsValid)
{
MyClass record = new MyClass();
record.SAFirstName = model.FirstName;
record.SALastName = model.LastName;
record.SATitle = model.Title;
record.SAEmail = model.EmailAddress;
record.Since = DateTime.Now;
_uow.AdministratorRepository.AddRecord(record);
_uow.SaveChanges();
return RedirectToAction("Index", "Administrator");
}
return View(model);
}
}
2)我UOW看起來是這樣的:
公共類的UnitOfWork:IUnitOfWork { 私人只讀MasterContext _context;
public UnitOfWork(MasterContext context)
{
_context = context;
}
public UnitOfWork()
{
_context = new MasterContext();
}
public void SaveChanges()
{
_context.SaveChanges();
}
private IAdministratorRepository _Repo;
public IAdministratorRepository AdministratorRepository
{
get
{
if (this._Repo == null)
{
this._Repo = new IAdministratorRepository(_context);
}
return _Repo;
}
}
3)和我AdministratorRepository構造的樣子:
private readonly MasterContext _context;
public AdministratorRepository(MasterContext context)
{
_context = context;
}
經典答案是,你沒有。你抽象出像數據庫這樣的東西。但是,我的新想法是,您使用SQL CE或SQL Server LocalDB來創建一個被抽取到測試生命週期的數據庫。 – Aron
您已經完成了艱苦的工作,通過在可嘲弄的界面後面抽象數據庫訪問。只需創建一個模擬你想要的動作的存根,或者使用一個模擬框架。如果您有任何直接傳遞Linq的方法,那麼您將遇到一些問題,因爲Linq to Entities與Linq對象的行爲略有不同,這是大多數模擬框架將使用的。 –