[英]Unit testing CRUD operation in visual studio 2012
我正在Visual Studio 2012中測試create類
我的控制器類是:
public ActionResult Create()
{
return View();
}
//
// POST: /Member/Create
[HttpPost]
public ActionResult Create(Member member)
{
if (ModelState.IsValid)
{
db.Members.Add(member);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(member);
}
測試類是:
[TestClass]
public class MemberTest
{
[TestMethod]
public void Create(Member mem)
{
mem.MemID = 123;
mem.MemName = "sruthy";
/// dont know what is writing.
}
}
SampleDataContext.cs
public class SampleDataContext:DbContext
{
public DbSet<Member> Members { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
我被困在測試用例中請幫助我。
首先 - 為您的數據訪問代碼創建一個抽象(模擬DbContext不是很方便):
public interface IMemberRepository
{
void Add(Member member);
}
並讓你的控制器依賴它
public MemberController(IMemberRepository repository)
{
this.repository = repository;
}
這將允許輕松地模擬數據訪問代碼。 下一步 - 編寫驗證控制器行為的測試(我在這里使用NUnit和Moq):
private MemberController controller;
private Mock<IMemberRepository> repositoryMock;
private Member member;
[SetUp]
public void Setup()
{
repositoryMock = new Mock<IMemberRepository>();
controller = new MemberController(repositoryMock.Object);
member = new Member { MemID = 123, MemName = "sruthy" };
}
[Test]
public void ShouldCreateMemberWhenItIsValid()
{
var result = (RedirectToRouteResult)controller.Create(member);
Assert.That(result.RouteValues["action"], Is.EqualTo("Index"));
repositoryMock.Verify(r => r.Add(member));
}
[Test]
public void ShouldNotCreateMemberWhenItIsNotValid()
{
controller.ModelState.AddModelError("MemName", "Something wrong");
var result = (ViewResult)controller.Create(member);
Assert.That(result.ViewName, Is.Empty);
}
並編寫實現:
[HttpPost]
public ActionResult Create(Member member)
{
if (ModelState.IsValid)
{
repository.Add(member);
return RedirectToAction("Index");
}
return View(member);
}
我在單元測試中理解的是:“ 只測試你的方法在做什么 ”所以我認為你必須測試你的方法做得很好:
ModelState.IsValid
db.Members.Add(部件)
但不是ModelState或DbContext的良好行為。 這些都在他們自己的單元測試中進行測試 你必須斷言只有通話完成。
要執行此類測試,您必須使用依賴注入模式並通過模擬替換真正的DbContext。 這些模擬只是聲明調用很好地執行而不涉及真正的dbContext。
我不是單元測試的專家,但我認為你必須考慮所有的架構才能解耦你的對象。 這允許您通過模擬替換真實對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.