Here's what I've come up with, I'm not sure what are you trying to do exactly.
[TestFixture]
public class CallChain
{
[Test]
public void Test()
{
var mockery = new MockRepository();
var repository = mockery.DynamicMock<IRepository>();
var findMock = mockery.DynamicMock<IFindQueryPart>();
var orderMock = mockery.DynamicMock<IOrderQueryPart>();
var groupMock = mockery.DynamicMock<IGroupQueryPart>();
var returnedItemsStub = new ArrayList();
var mocks = new object[] { groupMock, orderMock, findMock, repository };
var methods = MethodsFromLambda(repo => repo.Find(null)
.Order(null)
.Group(null)
.All()).ToList();
using (mockery.Record())
{
for (var i = methods.Count - 1; i > 0; i--)
SetupResult.For(methods[i].Invoke(mocks[i], new object[] {null}))
.IgnoreArguments()
.Return(mocks[i - 1]);
SetupResult.For(methods[0].Invoke(groupMock, null)).IgnoreArguments().Return(returnedItemsStub);
}
using (mockery.Playback())
{
var returnedItems = repository.Find(null)
.Order(null)
.Group(null)
.All();
Assert.That(returnedItems, Is.EqualTo(returnedItemsStub));
}
}
private static IEnumerable<MethodInfo> MethodsFromLambda(Expression<Action<IRepository>> expr)
{
var body = expr.Body as MethodCallExpression;
while (body != null)
{
yield return body.Method;
body = Expression.Lambda<Action<IRepository>>(body.Object, expr.Parameters).Body as MethodCallExpression;
}
}
}
public interface IRepository
{
IFindQueryPart Find(object o);
}
public interface IFindQueryPart
{
IOrderQueryPart Order(object order);
}
public interface IOrderQueryPart
{
IGroupQueryPart Group(object projection_for_group);
}
public interface IGroupQueryPart
{
ArrayList All();