Moq - Как шагнуть в реальный метод?

1

Я хочу войти в реальный метод, используя тестовые данные в качестве входных данных.

Когда вызывается GetSurveyList, он не обращает внимания на дату, которую я даю. Он всегда возвращает все три элемента, которые я вручную добавил в mockModel. Он должен проверять дату и возвращать только те элементы, у которых есть дата, которая равна или больше даты ввода.

Если я вхожу, я только добираюсь до интерфейса. Следующий шаг в вызове должен перейти к коду, который реализует интерфейс, и все же это не так. Является ли это стандартным поведением Мока? Я думал, это позволит вам войти?

Вот мой код:

[TestMethod]
public void TestHasListOfSurveys()
{
    var mockRepository = new Mock<ISurveyListRepository>();
    var mockModel = new List<SurveyList>();
    mockModel.Add(new SurveyList { SurveyID = 1, SurveyName = "test1", DeliveryDate = DateTime.Parse("1/1/2014") });
    mockModel.Add(new SurveyList { SurveyID = 2, SurveyName = "test2", DeliveryDate = DateTime.Parse("6/1/2014") });
    mockModel.Add(new SurveyList { SurveyID = 3, SurveyName = "test3", DeliveryDate = DateTime.Parse("12/1/2014") });

    string testDate = DateTime.Today.ToShortDateString();

    mockRepository.Setup(x => x.GetSurveyList(testDate)).Returns(mockModel);

    var testClass = new SurveyListModel(mockRepository.Object);
    var testModel = testClass.GetSurveyList(testDate);

    mockRepository.VerifyAll();

    Assert.IsTrue(testModel.Count > 0);
}

GetSurveyList из репозитория:

открытый класс SurveyListRepository: ISurveyListRepository

public List<SurveyList> GetSurveyList(String deliveryDateAfterInput)
{
    List<SurveyList> SurveyLists = new List<SurveyList>();
    string error = string.Empty;

    using (OrderingEntities db = DierbergsAppLib.Entities.EntityFactory.GetInstance<OrderingEntities>(
               new DierbergsAppLib.Entities.EntityFactory.EntityFactoryOptions()
               {
                   EntityNameInConfigFile = "OrderingEntities",
                   ConnectionStringCacheManager = new DierbergsAppLib.Entities.WebCacheConnectionStringManager()
               },
               out error))
    {
        DateTime deliveryDateFilter = Convert.ToDateTime(deliveryDateAfterInput);

        var SurveyList = db.uspOrderSurveyListAllStoresGet(deliveryDateFilter);

        foreach (uspOrderSurveyListAllStoresGet_Result viewsurvey in SurveyList)
        {
           // SurveyLists.Add( )
        }
    }

    List<SurveyList> all = SurveyLists.OrderBy(x => x.SurveyDueDate).ToList();
    return all;
}

GetSurveyList от модели:

открытый класс SurveyListModel

public List<SurveyList> GetSurveyList(String deliveryDateAfterInput)
{
    return _repository.GetSurveyList(deliveryDateAfterInput);
}
Теги:
unit-testing
moq

2 ответа

2
Лучший ответ

Тесты - это характеристики вашего кода. Давайте рассмотрим, какой сценарий поведения SurveyListModel вы пытаетесь указать в этом тесте. В этом случае логика очень проста:

SurveyListModel должен возвращать опросы из хранилища за указанную дату

Итак, если вы остановитесь и подумаете, то вам не следует проверять даты возвращенных опросов. Обязанности SurveyListModel не связаны с изменением ответа на репозиторий. Он должен выполнить следующий параметр даты передачи в один конкретный метод репозитория и просто вернуть ответ репозитория вызывающему. Ничего больше. Это то, что вы должны проверить.

var repositoryMock = new Mock<ISurveyListRepository>();
string date = DateTime.Today.ToShortDateString();
repositoryMock.Setup(r => r.GetSurveyList(date)).Returns(CreateTestSurveys());
var model = new SurveyListModel(repositoryMock.Object);

var surveys = model.GetSurveyList(date);

repositoryMock.VerifyAll();
CollectionAssert.AreEqual(CreateTestSurveys(), surveys);

Этот тест подтверждает, что

  • список опросов, называемый правильным методом репозитория (если метод не был вызван, проверка завершится неудачно)
  • правильная дата была отправлена (если SurveyListModel будет передавать другую дату в репозиторий, настройка не будет выполнена)
  • список опросов вернул точно такие же опросы, которые он получил из репозитория (если SurveListModel будет возвращать различные опросы или каким-либо образом модифицировать ответ репозитория, тогда утверждение должно завершиться неудачно).

Вы должны понимать, что на самом деле не имеет значения, какой репозиторий возвращается в этом сценарии. Это могут быть опросы с любыми датами или пустым списком, как указано выше. Вы должны просто убедиться, что SUT была возвращена точно такая же коллекция.

ПРИМЕЧАНИЕ. Используйте DateTime для передачи значений даты.

  • 0
    Метод SurveyListModel, хотя GetSurveyList выполняет фильтрацию. Но после того, как этот метод вызван, у testModel есть счетчик 3, поэтому фильтрация не была выполнена.
  • 0
    @hyprsleepy Хорошо, теперь я понял логику вашего теста. обновленный
Показать ещё 2 комментария
1
mockRepository.Setup(x => x.GetSurveyList(testDate)).Returns(mockModel);

Это устанавливает ваш mock репозиторий, чтобы вернуть полную модель, когда вы GetSurveyList(testDate), что означает, что дата игнорируется. Предположительно SurveyListModel рассчитывает только вернуть SurveyList для даты, переданной этому методу.

Если вы хотите, чтобы он сделал правильную вещь, mockModel.Add строку mockModel.Add с данными, которые вы хотите, чтобы mock repository действительно возвращался в ваш тест.

Однако теперь, когда вы разместили код, который вы тестируете, ясно, что этот тест бессмыслен. Вы издеваетесь над кодом, который на самом деле делает всю работу! Весь метод, который вы тестируете, возвращает возвращенные данные.

Также не используйте DateTime.Today как ваша дата теста или тест может не работать завтра!

  • 0
    Вы говорите, что если я заберу Возврат, он сделает то, что я хочу?
  • 0
    @hyprsleepy Нет, вы говорите, чтобы вернуть всю макет модели. Если бы вы забрали возврат, он не знал бы, что вернуть. Если ваш тест требует, чтобы он возвращал определенные данные (например, только сегодняшнюю дату), вам нужно указать ему, чтобы он возвращал эти данные.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню