Насмешливый унаследованный класс с Moq - PullRequest
1 голос
/ 19 апреля 2011

У меня есть несколько методов веб-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 наобщественности также.

1 Ответ

1 голос
/ 19 апреля 2011

с макушки головы:

var storage = new Mock<IStorage>();
storage.Setup(x => x.CreateWishList(It.IsAny<long>(), It.IsAny<string>())
       .Returns(10);

Затем создайте объект CreateWishList с его собственным конструктором, принимающим IStorage.

var createWishList = new CreateWishList(storage.Object);  

Для модульного тестирования вашего метода CreateWishList() вы должны написать отдельный тест. Этот тест должен просто проверить код в CreateWishListV1().

...