Издевательские общие методы
Предположим, что у меня есть некоторый интерфейс с общим методом и без параметров:
public interface Interface {
void Method<T>();
}
Теперь я хочу реализовать макет для этого класса (я использую Moq
), и я хочу издеваться над этим методом для какого-то конкретного типа - скажем, я издеваюсь над вызовами Method<String>()
.
mock = new Mock<Interface>();
mock.Setup(x => x.Method ????).Returns(String("abc"));
Идея ????
должна быть ясной - это lambda выражение должно обрабатывать случай, когда T
в Method<T>
на самом деле является String
.
Есть ли способ достичь желаемого поведения?
Ответы
Ответ 1
Просто:
mock.Setup(x => x.Method<string>()).Returns("abc");
Также убедитесь, что ваш метод фактически возвращает что-то, поскольку в настоящее время тип возврата определяется как void
:
public interface Interface
{
string Method<T>();
}
class Program
{
static void Main()
{
var mock = new Mock<Interface>();
mock.Setup(x => x.Method<string>()).Returns("abc");
Console.WriteLine(mock.Object.Method<string>()); // prints abc
Console.WriteLine(mock.Object.Method<int>()); // prints nothing
}
}
Ответ 2
Я сам не использовал Moq, но я бы ожидал:
mock.Setup(x => x.Method<string>());
(Обратите внимание, что ваш метод sample имеет тип возврата void, поэтому он ничего не должен возвращать...