У меня есть несколько методов веб-API, для которых я хочу написать модульные тесты.Они нуждаются в доступе к базе данных, поэтому, естественно, я хотел Moq этой части.
Доступ к классам хранения осуществляется через интерфейс, а класс, реализующий метод API, наследует интерфейс.Чего я не знаю, так это как макетировать унаследованный интерфейс в модульном тесте.
public class CreateWishList : APIAccess
{
public long CreateWishListV1(long userId, string wishListName)
{
// Do stuff like
long result = Storage.CreateWishList(userId, wishListName);
return result;
}
}
public class APIAccess
{
protected IStorage Storage { get; private set; }
public APIAccess() : this(new APIStorage()) { }
public APIAccess(IStorage storage)
{
Storage = storage;
}
}
public interface IStorage
{
long CreateWishList(long userId, string wishListName);
}
Итак, я хочу провести модульное тестирование метода CreateWishListV1(...)
и сделать это без доступа к базе данных.надо издеваться над тем, что Storage.CreateWishList(...)
возвращает.Как мне это сделать?
ОБНОВЛЕНИЕ:
Я пытаюсь что-то вроде этого:
[Test]
public void CreateWishListTest()
{
var mockAccess = new Mock<APIAccess>(MockBehavior.Strict);
mockAccess.Setup(m => m.Device.CreateWishList(It.IsAny<long>(), It.IsAny<string>())).Returns(123);
var method = new CreateWishList();
method.Storage = mockAccess.Object;
long response = method.CreateWishListV1(12345, "test");
Assert.IsTrue(response == 123, "WishList wasn't created.");
}
Пришлось изменить свойство Storage
на APIAccess
наобщественности также.