2013-09-30 89 views
6

我測試的創建類在Visual Studio 2012單元測試CRUD操作2012

我的控制器類是:

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>(); 
    } 
} 

我被困在測試用例請幫助我。

回答

5

首先 - 創建數據訪問代碼的抽象(嘲諷的DbContext也不是很方便的事情):

public interface IMemberRepository 
{ 
    void Add(Member member); 
} 

,使您的控制器依賴於它

public MemberController(IMemberRepository repository) 
{ 
    this.repository = repository; 
} 

這將使模擬數據輕鬆訪問代碼。下一步 - 寫一個驗證控制器行爲(我使用NUnit和最小起訂量這裏)測試:

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); 
} 
+1

這正是我想寫 – bAN

+0

是否回答這個問題還需要' [TearDown]'清理的方法? – christiandev

+0

@christiandev因此在每次測試運行前分配給字段的新值,您不需要TearDown –

3

我在單元測試中瞭解什麼是:「只有你的方法是做測試」所以我認爲你必須測試你的方法做得很好:

  • ModelState.IsValid

  • db.Members.Add(部件)

  • db.SaveChanges()

但不是ModelState或DbContext的良好行爲。這些在他們自己的單元測試中進行測試。你必須斷言只有通話完成。

要執行這種測試,您必須使用依賴注入模式並通過mocks替換真正的DbContext。這些嘲笑只是斷言調用很好地執行,而不涉及真正的dbContext。

我不是一個單元測試的專家,但我認爲你必須考慮所有的體系結構以分離你的對象。這允許你通過模擬來替換真實的物體。