Этот тест действительно добавляет ценность ...? - PullRequest
1 голос
/ 23 января 2011

Когда я пишу тесты для простого приложения asp.net mvc 3, я заметил кое-что о тесте, который я написал вслепую в прошлом.

[TestMethod]
public void Add_Saves_Object()
{
    var rep = new Mock<IRepository>();
    rep.Setup(x => x.Save<Object>(It.IsAny<Object>())).Returns(new Object() {Id = 1});

    var pick = rep.Object.Save<Pick>(new Object());

    Assert.IsNotNull(pick);
    Assert.AreEqual(1, pick.Id);
}

Предполагается, что я протестировал свою реализацию IRepository в хранилище данных «в памяти», а метод Save правильно возвращает объект (так как я проверяю свой репозиторий). Поскольку мои тесты репозитория проходят успешно, нужно ли мне проверять, правильно ли мой контроллер вызывает репозиторий и получает объект обратно из метода save? Этот тест добавляет ценность? Стоит ли время, чтобы написать это?

Если я добавлю кривую к этому сценарию, т. Е. Метод SaveObject на моем контроллере перенаправляет на другое действие, как бы я протестировал перенаправление?

Ответы [ 3 ]

2 голосов
/ 23 января 2011

Нет.

В этом сценарии вы проверяете, что вы написали свой тест правильно.

Тестирование с репозиториями в памяти, как правило, в целом плохо, если вы используете СУБД любого типа, потому что, если вы не реплицируете все данные и ограничения отношений, очень легко писать тесты по сценариям, которые никогда не произойдутпроизводство.

1006 * Сейчас это спорно, но этот тип испытания практически бесполезен, потому что его, вероятно, ваше приложение не будет работать даже без этой части логики работы.Все ваши интеграционные тесты также не пройдут, если эта часть логики не пройдёт.Это достаточно хорошо для меня.
1 голос
/ 23 января 2011

Если вы хотите проверить свой репозиторий, не стоит его издеваться.Вместо этого смоделируйте его зависимости.

Для тестирования перенаправлений попробуйте mvccontrib Test Helper.С его помощью вы можете сделать что-то вроде этого:

        [Test]
        public void RedirectToIndex()
        {
            SomeController controller = new SomeController();
            ActionResult result = controller.Index();
            result.AssertActionRedirect().ToAction("Index");
        }
1 голос
/ 23 января 2011

Похоже, единственное, что тестирует этот тест, - это то, что ваш макет фреймворка настроен правильно. Я бы сказал, что в таком тесте есть минимальное значение.

Чтобы попытаться ответить на ваш второй вопрос, если ваш метод SaveObject перенаправляет на другое действие, скажем, X, я бы подумал, что вы захотите проверить, что X какое-то открытое действие было выполнено с помощью другого макета. Трудно быть более конкретным без подробностей.

...