Проблема не в том, что вы пытаетесь смоделировать универсальный c интерфейс; проблема в том, что метод, который вы пытаетесь смоделировать, имеет возвращаемый тип Task
, асинхронный эквивалент void
. Нет смысла пытаться имитировать его, чтобы вернуть значение.
Какого типа вы ожидаете, что метод Call
на вашем IClient
интерфейсе вернется?
Здесь я настроил ваш интерфейс, добавив дополнительный параметр типа U
для типа возвращаемого значения метода Call
:
public interface IClient<T, U>
{
Task<U> Call(Expression<Func<T, Task>> expression);
}
Затем в следующем модульном тесте я смоделировал это вернуть целое число 123
:
[Fact]
public async Task MockingAnAsynchronousMethod()
{
var mock = new Mock<IClient<IRepository, int>>();
// Setup
mock.Setup(x => x.Call(s => s.Get(1))).ReturnsAsync(123);
var result = await mock.Object.Call(s => s.Get(1));
Assert.Equal(123, result);
}