2010-12-10 4 views
18

Предположим, у меня есть некоторый интерфейс общего метода и без параметров:Mocking общие методы

public interface Interface { 
    void Method<T>(); 
} 

Теперь я хотел бы реализовать макет для этого класса (я использую Moq), и я хочу, чтобы дразнить этот метод для какого-то конкретного типа - допустим, я издеваюсь над Method<String>() звонками.

mock = new Mock<Interface>(); 
mock.Setup(x => x.Method ????).Returns(String("abc")); 

Идея ???? должно быть ясно - это лямбда-выражение должно обрабатывать случай, когда T в Method<T> фактически String.

Есть ли способ достичь желаемого поведения?

ответ

20

Просто:

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 
    } 
} 
+0

Не следует `string Метод ` be `T Метод `? – Scott 2010-12-10 11:46:23

5

Я не использовал Moq себя, но я бы ожидать:

mock.Setup(x => x.Method<string>()); 

(Обратите внимание, что выборочный метод имеет тип возвращаемого недействительным, поэтому он не должен возвращаться ничего ...

+0

В этом случае настройка не нужна, так как макет создается в свободном режиме. – 2014-06-24 14:58:18