Модульное тестирование работы CRUD в visual studio 2012
Я тестирую класс create в 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.
}
}
SampleDataContext.cs
public class SampleDataContext:DbContext
{
public DbSet<Member> Members { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
Я застрял в тестовом случае, пожалуйста, помогите мне.
2 ответов
First-создайте абстракцию для вашего кода доступа к данным (издевательство над 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.Члены.Add (member)
- db.SaveChanges ()
но не хорошее поведение ModelState или DbContext. Они тестируются в своих собственных модульных тестах. Вы должны утверждать, что только вызов сделан.
выполнить такой тест вы должны использовать шаблон инъекции зависимостей и заменить реальный DbContext на mocks. Эти насмешки просто утверждают, что вызов хорошо выполнен без привлечения реального dbContext.
Я не специалист в модульном тестировании, но я думаю, что вы должны думать всю свою архитектуру, чтобы отделить ваши объекты. Это позволяет заменять реальные объекты насмешками.