在Visual Studio 2012中对CRUD操作进行单元测试
本文关键字:操作 单元测试 CRUD 中对 Visual Studio 2012 | 更新日期: 2023-09-27 18:33:21
我正在Visual Studio 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.
}
}
样本数据上下文.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。成员添加(成员)
- .db。保存更改()
但不是ModelState或DbContext的良好行为。它们在自己的单元测试中进行测试。您必须断言仅调用已完成。
要执行此类测试,您必须使用依赖注入模式,并将真正的 DbContext 替换为模拟。这些模拟只是断言调用执行良好,而不涉及真正的 dbContext。
我不是单元测试方面的专家,但我认为你必须考虑所有的架构才能分离你的对象。这允许您用模拟替换真实对象。