2013-09-30 90 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。

我不是一个单元测试的专家,但我认为你必须考虑所有的体系结构以分离你的对象。这允许你通过模拟来替换真实的物体。