Макетирование интерфейса как более чем одного типа

-6

Почему этот код не работает?

var channelsList = new List<IChannel>
{
Mock.Of<IChannel>(m => m == new ChannelOne()),
Mock.Of<IChannel>(m => m == new ChannelTwo()),
};

спросил(а) 2021-01-25T12:42:38+03:00 5 месяцев назад
1
Решение
77

Предполагая, что IChannel определен как:

public interface IChannel
{
int DoWork();
int DoOtherWork();
}

Тогда вы можете определить другое поведение, используя Moq.Linq следующим образом:

var channelsList = new List<IChannel>
{
Mock.Of<IChannel>(m => m.DoWork() == 1 && m.DoOtherWork() == 1),
Mock.Of<IChannel>(m => m.DoWork() == 2)
};

Assert.Equal(1, channelsList.First().DoWork());
Assert.Equal(2, channelsList.Last().DoWork());

Однако есть ограничение, что вы не можете настроить Throws например...

LINQ to Mocks отлично подходит для быстрого устранения зависимостей, которые обычно не нуждаются в дальнейшей проверке. Если вам позже понадобится проверить некоторые вызовы этих макетов, вы можете легко получить их с помощью Mock.Get(instance).

примечание: акцент мой

LINQ to Mocks.

ответил(а) 2021-01-25T12:42:38+03:00 5 месяцев назад
46

Чтобы получить желаемое поведение

var channelsList = new List<IChannel> {
Mock.Of<IChannel>(),
Mock.Of<IChannel>(),
};

каждый вызов Mock.Of<IChannel>() будет возвращать новый макет IChannel.

LINQ to Mocks отлично подходит для быстрого устранения зависимостей, которые обычно не нуждаются в дальнейшей проверке. Если вам позже понадобится проверить некоторые вызовы этих макетов, вы можете легко получить их с помощью Mock.Get(instance).

примечание: акцент мой

LINQ to Mocks.

ответил(а) 2021-01-25T12:42:38+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема