Модульное тестирование работы 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.

Я не специалист в модульном тестировании, но я думаю, что вы должны думать всю свою архитектуру, чтобы отделить ваши объекты. Это позволяет заменять реальные объекты насмешками.