Макет метода класса

#c# #unit-testing #mocking #moq

#c# #модульное тестирование #издевательство #moq

Вопрос:

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

   var storemock = new Mock<IKeyValueStore>();
  storemock.Setup(m => m.Restore<List<IProductDescription>>(It.IsAny<string>(),null,new StringDataContractSerializer())).Returns(ListOfProductDescriptions);

  private List<IProductDescription> ListOfProductDescriptions()
  {
     var obj1 = new ProductDescription("id1");
     var lst = new List<IProductDescription>();
     lst.Add(obj1);

     return lst;
  }
  

я передаю этот объект storemock одному из моих конструкторов тестовых классов. скажем, TestClass

 var objtestclass = new TestClass(storemock.Object);
  

и я вызываю метод, вызывающий метод восстановления.

 objtestclass.checkstore();
  

во время конструктора я устанавливаю частное поле IkeyValueStore типа _store. Итак, мой конструктор testclass :-

 public TestClass(IkeyValueStore store)
{
   _store = store;
} 
  

Мой метод тестирования (восстановление) :-

 Public async Task<IEnumerable<IProductDescription>> checkscore()
{
   // here products is coming null.
   Products = _store.Restore<List<IProductDescription>>(CachedProductsKey, null, new StringDataContractSerializer());
}
  

Проблема: — В методе checkstore у продукта должен быть список описаний продуктов, но он становится нулевым. Я делаю неправильный макет IkeyValueStore? любая помощь приветствуется.

Ответ №1:

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

В вашей настройке вместо использования new StringDataContractSerializer() try It.IsAny<StringDataContractSerializer>()

Комментарии:

1. Точно. Он сравнивает экземпляр.

2. @Matthew Это точная проблема. Спасибо 🙂