Я сталкиваюсь с этой проблемой, пытаясь смоделировать некоторые объекты, которые получают сложные лямбда-выражения в моих проектах. В основном с прокси-объектами, которые получают этот тип делегата:
Func<Tobj, Fun<TParam1, TParam2, TResult>>
Я пытался использовать Moq, а также RhinoMocks, чтобы выполнить насмешку над этими типами объектов, однако оба не удаются.
Это упрощенный пример того, что я пытаюсь сделать: во-первых, у меня есть объект Calculator, который выполняет вычисления:
public class Calculator
{
public int Add(int x, int y)
{
var result = x + y;
return result;
}
public int Substract(int x, int y)
{
var result = x - y;
return result;
}
}
Далее мне нужно проверить параметры каждого метода в классе Calculator, поэтому для соблюдения принципа единой ответственности я создаю класс валидатора. Я подключаю все, используя класс Proxy, который предотвращает дублирование кода:
public class CalculatorProxy : CalculatorExample.ICalculatorProxy
{
private ILimitsValidator _validator;
public CalculatorProxy(Calculator _calc, ILimitsValidator _validator)
{
this.Calculator = _calc;
this._validator = _validator;
}
public int Operation(Func<Calculator, Func<int, int, int>> operation,
int x,
int y)
{
_validator.ValidateArgs(x, y);
var calcMethod = operation(this.Calculator);
var result = calcMethod(x, y);
_validator.ValidateResult(result);
return result;
}
public Calculator Calculator { get; private set; }
}
Наконец, я тестирую компонент, который использует CalculatorProxy, поэтому я хочу его смоделировать, например, используя Rhino Mocks:
[TestMethod]
public void ParserWorksWithCalcultaroProxy()
{
var calculatorProxyMock = MockRepository.GenerateMock<ICalculatorProxy>();
calculatorProxyMock.Expect(x => x.Calculator).Return(_calculator);
calculatorProxyMock.Expect(x => x.Operation(c => c.Add, 2, 2)).Return(4);
var mathParser = new MathParser(calculatorProxyMock);
mathParser.ProcessExpression("2 + 2");
calculatorProxyMock.VerifyAllExpectations();
}
Однако я не могу заставить его работать! Moq терпит неудачу с NotSupportedException, а в RhinoMocks просто он никогда не оправдывает ожиданий.