Как реализовать и проверить ASP.NET MVC FakeRepository - PullRequest
0 голосов
/ 04 декабря 2009

Приветствуется любая помощь.

Я стараюсь писать код с использованием ASP.NET MVC Framework, я вроде продал эту концепцию.

Сейчас мой главный камень преткновения - как настроить и протестировать хранилище, которое заменяет базу данных. Чтобы протестировать приложение MVC, я создал класс и назвал его fakerepository.cs. Этот класс реализует методы из интерфейса IContactManagerRepository.

namespace MyTestMVCProject.Models
{
    public class FakeContactManagerRepository : IContactManagerRepository
    {
        IList<Contact> _contacts = new List<Contact>();

        #region IContactManagerRepository Members

        public Contact Create(Contact contact)
        {
            _contacts.Add(contact);
            return contact;
        }

        public Contact Edit(Contact contact)
        {
            throw new NotImplementedException();
        }

        public void Delete(int id)
        {
            throw new NotImplementedException();
        }

        public IList<Contact> ListContacts()
        {
            return _contacts;
        }

        #endregion
    }
}

В приведенной ниже попытке теста я хочу убедиться, что контакт создан и значение ID правильное.

[Test]
public void Test_02_ContactController_Passes_ViewData_To_Details_View()
{
    // Arrange
    ContactController _controller = new ContactController();

    // Act
    var _contact = new Contact
    {
        Id = 1,
        FirstName = "Donald",
        LastName = "Duck"
    };

    var _result = _controller.Create(_contact) as ViewResult;
    var contact = _result.ViewData.Model as Contact;

    // Assert
    Assert.AreEqual(1, _contact.Id);
}

К сожалению, тест всегда заканчивается неудачей.

Конечно, я очень плохо знаком с тестированием, но за короткий промежуток времени я многому научился, выполняя поиск в Google и просматривая видеоролики ASP.NET MVC.

Кто-нибудь может подсказать, как я могу протестировать поддельный репозиторий, который возвращает список в ViewResult?

1 Ответ

2 голосов
/ 04 декабря 2009

Тест может выглядеть следующим образом:

[Test]
public void PostingValidContactCreatesOneInRepositoryAndReturnsViewResult()
{
    // Arrange
    var controller = new ContactController(new FakeContactManagerRepository());

    // Act
    var contact = new Contact
    {
        Id = 1,
        FirstName = "Donald",
        LastName = "Duck"
    };

    var result = controller.Create(contact);

    //Assert there is one created Contact in repository
    Assert.AreEqual(1, Repository.ListContacts().Count());
    //Check if result is ViewResult
    Assert.IsInstanceOfType(result,typeof(ViewResult));
    //Assert item Id is 1
    Assert.AreEqual(1, Repository.ListContacts().First().ID);
    //Check if posting valid contact doesn't invalidate model state
    Assert.IsTrue(controller.ModelState.IsValid);
}

ContactController должен принимать IContactManagerRepository в конструкторе

public ContactController(IContactManagerRepository repository);

В тестах вы предоставляете его с FakeContactManagerRepository, при реальном использовании вы можете добавить свой реальный репозиторий.

РЕДАКТИРОВАТЬ

Ваши ошибки:

var contact = _result.ViewData.Model as Contact;

Отправленный контакт находится не в _result.ViewData.Model, а в параметре функции Create.,

var _result = _controller.Create(_contact) as ViewResult;

Это не ошибка, но вы можете определить как

var _result = _controller.Create(_contact)

и проверить, имеет ли результат правильный тип.

Assert.AreEqual(1, _contact.Id);

Это не имеет смыслаВы назначили _contact.Id несколькими строками ранее.Вы должны взять контакт из хранилища и проверить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...