В то время как вся польза отвечает, большая часть работы arounds предложенный полагаются на C# 3.0
Так, ради полноты, я добавлю другое решение, которое не использует ни лямбд, ни типа Func (Предоставленный, что, как Matt Olenik упомянул в комментариях, можно было обобщить ниже делегатов в работе тот же путь.). Для тех, как я, кто может все еще работать с C# 2.0. Возможно, не лучшее решение, но это работает.
public class Example
{
public delegate void DoStuffDelecate();
public DoStuffDelecate DoStuff;
public delegate void DoStuffWithDelecate(int n);
public DoStuffWithDelecate DoStuffWithParameter;
public delegate int DoStuffWithReturnDelecate();
public DoStuffWithReturnDelecate DoStuffWithReturnValue;
}
class Program
{
static int MethodWithReturnValue()
{
return 99;
}
static void MethodForDelecate()
{
Console.WriteLine("Did Stuff");
}
static void MethodForDelecate(int n)
{
Console.WriteLine("Did Stuff with parameter " + n);
}
static void Main(string[] args)
{
var x = new Example();
x.DoStuff = MethodForDelecate;
x.DoStuffWithParameter = MethodForDelecate;
x.DoStuffWithReturnValue = MethodWithReturnValue;
x.DoStuff();
x.DoStuffWithParameter(10);
int value = x.DoStuffWithReturnValue();
Console.WriteLine("Return value " + value);
Console.ReadLine();
}
}
Используйте настраиваемый делегат Do, который принимает функцию, и проверьте это. Вы можете сделать это, преобразовав его в выражение и проанализировав дерево выражений, или просто запустите делегат с фиктивным вводом и протестируйте результаты.
Следующий код вызовет ошибку, если лямбда внутри RemoteCall () не содержит x => x.Execute ("test") - вы можете отказаться от идеи, чтобы заставить его делать именно то, что вы хотите.
public interface IExecute {
void Execute(string input)
}
_connectionService
.Stub(c => c.RemoteCall(null)).IgnoreArguments()
.Do(new Func<Action<IExecute>,bool>( func => {
var stub = MockRepository.GenerateStub<IExecute>();
func(stub);
stub.AssertWasCalled(x => x.Execute("test"));
return true;
}));;
Если вас не интересует точное значение параметра "test", вы можете использовать конструкцию Arg <>
:
_connectionService.Stub(c => c.RemoteCall( Arg<Func<string, bool>>.Is.NotNull ))
.Return(true);