#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 Это точная проблема. Спасибо 🙂