2014-05-15 3 views
1

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

Когда вызывается 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 из Repository:

класса 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); 
} 
+0

Пожалуйста, уточните свой вопрос с кодом для 'SurveyListModel.GetSurveyList' –

+0

Можете ли вы объяснить, что должен делать' SurveyListModel', когда вызывается 'GetSurveyList'? Что такое 'testModel', возвращенный этим методом? –

+0

Я добавил GetSurveyList к сообщению. – hyprsleepy

ответ

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 вернет различные опросы или изменит репозиционирование ory-ответ каким-либо образом, тогда утверждение должно завершиться неудачно).

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

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

+0

Метод SurveyListModel GetSurveyList делает фильтрацию. Но после этого метода называется testModel имеет счет 3, поэтому фильтрация не была выполнена. – hyprsleepy

+0

@hyprsleepy Хорошо, теперь я получаю логику вашего теста. Обновлено –

+0

Я получаю ошибку, «CollectionAssert.AreEqual не удалось. (Элемент в индексе 0 не совпадает.)« Я проверил, и объекты одного типа, и все свойства кажутся одинаковыми. – hyprsleepy

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

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

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

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

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

+0

Вы говорите, что если я заберу Возвраты, он сделает то, что я хочу? – hyprsleepy

+0

@hyprsleepy Нет, вы говорите, что возвращаете всю макетную модель. Если вы забрали доход, он не знал бы, что вернуть. Если ваш тест требует, чтобы он возвращал определенные данные (например, только сегодняшнюю дату), вам необходимо сообщить ему, чтобы вернуть эти данные. –

+0

Должен ли я вместо этого не издеваться над кодом, который выполняет эту работу? Я изменил дату теста на «3/1/2014». Я не вижу, как настройка данных на mockModel будет только двумя с датами, которые соответствуют фильтру. – hyprsleepy

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