Я хочу войти в реальный метод, используя тестовые данные в качестве входных данных.
Когда вызывается 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);
}
Тесты - это характеристики вашего кода. Давайте рассмотрим, какой сценарий поведения 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);
Этот тест подтверждает, что
Вы должны понимать, что на самом деле не имеет значения, какой репозиторий возвращается в этом сценарии. Это могут быть опросы с любыми датами или пустым списком, как указано выше. Вы должны просто убедиться, что SUT была возвращена точно такая же коллекция.
ПРИМЕЧАНИЕ. Используйте DateTime
для передачи значений даты.
mockRepository.Setup(x => x.GetSurveyList(testDate)).Returns(mockModel);
Это устанавливает ваш mock репозиторий, чтобы вернуть полную модель, когда вы GetSurveyList(testDate)
, что означает, что дата игнорируется. Предположительно SurveyListModel
рассчитывает только вернуть SurveyList
для даты, переданной этому методу.
Если вы хотите, чтобы он сделал правильную вещь, mockModel.Add
строку mockModel.Add
с данными, которые вы хотите, чтобы mock repository действительно возвращался в ваш тест.
Однако теперь, когда вы разместили код, который вы тестируете, ясно, что этот тест бессмыслен. Вы издеваетесь над кодом, который на самом деле делает всю работу! Весь метод, который вы тестируете, возвращает возвращенные данные.
Также не используйте DateTime.Today
как ваша дата теста или тест может не работать завтра!