Как создать Moq макет для Func - PullRequest
3 голосов
/ 06 января 2012

У меня есть следующий метод Func, который мне нужно смоделировать

Func<Owned<ISomeInterface>> someMethod { get; set; }

но не могу понять, как его смоделировать с помощью фреймворка 'Moq'.

Я прочитал похожий пост на SO, но все еще не могу его высмеять, он всегда возвращается с

Выражение не является вызовом метода: x => Invoke (x.someMethod)

или

Соответствующий конструктор для данных аргументов не найден в издевались над типом. ----> System.MissingMethodException: конструктор включен тип 'Owned`1Proxy40a9bf91815d4658ad2453298c903652' не найден.

1 Ответ

4 голосов
/ 06 января 2012

Функция определена как свойство, поэтому вы должны использовать SetupSet в Moq

public interface IPersona
{
    string nome { get; set; }
    string cognome { get; set; }
    Func<Owned<ISomeInterface>> somemethod { get; set; }

}

.В вашем тесте:

Вы создаете макет для Func:

Func<Owned<ISomeInterface>> somemethodMock = () => new Mock<Owned<ISomeInterface>>().Object; 

Затем вы устанавливаете макет для класса, содержащего Func как свойство, и вы устанавливаете ожидание в методе Set:

var obj = new Mock<IMyInterface>();
obj.SetupSet(x => x.somemethod = somemethodMock).Verifiable();

Вы создаете объект контейнера для макета:

//We pass the mocked object to the constructor of the container class
var container = new Container(obj.Object);
container.AnotherMethod(somemethodMock);
obj.VerifyAll();

Вот определение другого метода класса Container, если получить func в качестве входного параметра и установитьэто к свойству содержавшегося объекта

enter  public class Container
{
    private IPersona _persona;

    public Container(IPersona persona)
    {
        _persona = persona;
    }

    public void AnotherMethod(Func<MyClass<IMyInterface>> myFunc)
    {
        _persona.somemethod = myFunc;
    }      
}
...