2016-11-20 6 views
1

Я пытаюсь проверить действие контроллера, которое принимает модель представления и создает новую запись. Здесь действие контроллера:Модуль Test MVC 5 Controller Создать действие с единицей работы и репозиторием

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(ContactViewModel viewModel) 
{ 
    if (!ModelState.IsValid) 
     return View("Create", viewModel); 

    _unitOfWork.Contacts.Add(Mapper.Map(viewModel, new Contact())); 

    _unitOfWork.Complete(); 

    return RedirectToAction("Index"); 
} 

И испытательная установка:

[TestClass] 
public class ContactControllerTests 
{ 
    private ContactsController _controller; 
    private Mock<IContactRepository> _mockRepository; 
    private string _userId; 
    private Mock<IUnitOfWork> _mockUoW; 

    [ClassInitialize] 
    public static void Init(TestContext context) 
    { 
     Mapper.Initialize(c => c.AddProfile<MappingProfile>()); 
    } 

    [TestInitialize] 
    public void TestInitialize() 
    { 
     _userId = "1"; 
     _mockRepository = new Mock<IContactRepository>(); 
     _mockUoW = new Mock<IUnitOfWork>(); 

     _mockUoW.SetupGet(u => u.Contacts).Returns(_mockRepository.Object); 

     _controller = new ContactsController(_mockUoW.Object); 

     _controller.MockCurrentUser(_userId, "[email protected]"); 
    } 

    [TestMethod] 
    public void CreatePost_ValidValuesSubmitted_ShouldCallComplete() 
    { 
     var viewModel = new ContactViewModel() 
     { 
      FirstName = "a", 
      LastName = "b" 
     }; 

     _controller.Create(viewModel); 

     _mockRepository.Object.GetContacts(_userId).Should().HaveCount(1); 
    } 
} 

Испытательное устройство всегда возвращает количество 0, а я надеюсь, что это будет 1. Я довольно новыми для TDD и я реализовал единица работы и образец хранилища, как показано на курсе Моша Хамедани по адресу: https://app.pluralsight.com/library/courses/full-stack-dot-net-developer-architecture-testing/table-of-contents

+1

Это не TDD (Test * Driven *), если вы пытаетесь проверить уже написанный фрагмент кода ... –

ответ

1

Вы не издевались над поведением репозитория в приведенном выше примере.

На основании предоставленного примера давайте предположим, что такой простой интерфейс.

public interface IContactRepository { 
    void Add(Contact contact); 
    IEnumerable<Contact> GetContacts(string _userId); 
} 

Необходимо, чтобы у вас была какая-то форма хранения данных.

[TestInitialize] 
public void TestInitialize() { 
    _userId = "1"; 
    var data = new List<Contact>();//To store test data. 
    //Configure repository 
    _mockRepository = new Mock<IContactRepository>(); 
    _mockRepository.Setup(m => m.Add(It.IsAny<Contact>())).Callback<Contact>(data.Add); 
    _mockRepository.Setup(m => m.GetContacts(_userId)).Returns(data); 
    //Configure UoW 
    _mockUoW = new Mock<IUnitOfWork>(); 
    _mockUoW.SetupGet(u => u.Contacts).Returns(_mockRepository.Object); 

    _controller = new ContactsController(_mockUoW.Object); 

    _controller.MockCurrentUser(_userId, "[email protected]"); 
} 

или отказаться от макета и создать фальшивку.

public class FakeContactRepository : IContactRepository { 
    private ICollection<Contact> data; 

    public FakeContactRepository(ICollection<Contact> data) {     
     this.data = data; 
    } 

    public void Add(Contact contact) { 
     data.Add(contact); 
    } 

    public IEnumerable<Contact> GetContacts(string _userId) { 
     return data; 
    } 
} 

и установить его для испытания.

[TestInitialize] 
public void TestInitialize() { 
    _userId = "1"; 
    var data = new List<Contact>();//To store test data. 
    //Configure repository 
    var fakeRepository = new FakeContactRepository(data); 
    //Configure UoW 
    _mockUoW = new Mock<IUnitOfWork>(); 
    _mockUoW.SetupGet(u => u.Contacts).Returns(fakeRepository); 

    _controller = new ContactsController(_mockUoW.Object); 

    _controller.MockCurrentUser(_userId, "[email protected]"); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^