Good. One question, how do you generalize this approach? I mean, you call
chain involves stuff you need to mock - actually, stub - and a final return
type. I dealt with it leaving the last call out of the loop and handling it
by hand. I'd like to see what you come up with in the end. BTW, seems a good
usage of the auto mocking container.

On Thu, Sep 25, 2008 at 12:52 PM, Vladan <[EMAIL PROTECTED]> wrote:

>
> .Invoke ..... aaaaargh, it was right in front of me and I forgot about
> it... thnx so much for the idea! it should work perfectly now.
>
> Ill try it out tonight and let you know.
>
>
>
>
> Vladan
>
> On Sep 23, 4:58 pm, "Simone Busoli" <[EMAIL PROTECTED]> wrote:
> > 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();
> >
> > }
> > On Tue, Sep 23, 2008 at 9:03 AM, Vladan <[EMAIL PROTECTED]> wrote:
> >
> > > no one?
> >
> > > On Sep 22, 10:50 am, Vladan <[EMAIL PROTECTED]> wrote:
> > > > Actually sorry, I've expressed something wrong...
> >
> > > > from MethodInfo I get the type that needs to be mocked... so I can
> > > > easily create the mock itself:
> >
> > > > var mock = mocks.DynamicMock(methodInfo.ReturnType);
> >
> > > > ... now how can I assign this?
> >
> > > > From methodInfo I have a method to which this mock needs to be
> > > > assigned to (methodInfo.Name), if I could only do this:
> >
> > > > SetupResult.For(findMethodInfo).Return(findMethodReturnTypeMock);
> >
> > > > On Sep 22, 10:39 am, Vladan <[EMAIL PROTECTED]> wrote:
> >
> > > > > I have a bit of a strange situation.
> >
> > > > > I have an Repository implementation which is based on a fluent
> > > > > interface for defining a Find query, it looks something like this:
> >
> > > > > var returnedItems = repository.Find(some_ICriteria)
> > > > >                                            .Order(some_Order)
> >
> > >  .Group(some_Projection_for_group)
> > > > >                                            .All()
> >
> > > > > Now, when testing this I need to write for example for SetupResult
> the
> > > > > following tedious code:
> >
> > > > > var findMock = mocks.DynamicMock<FindQueryPart>();
> > > > > var orderMock = mocks.DynamicMock<OrderQueryPart>();
> > > > > var groupMock = mocks.DynamicMock<GroupQueryPart>();
> > > > > var returnedItems = new List();
> >
> > > > > SetupResult.For(repository.Find(some_ICriteria)).Return(findMock);
> > > > > SetupResult.For(findMock.Order(some_Order)).Return(orderMock);
> >
> > >
> SetupResult.For(orderMock.Group(some_Projection_for_group)).Return(groupMock);
> > > > > SetupResult.For(groupMock.All()).Return(returnedItems);
> >
> > > > > As you can imagine, for a single query call this is alot of code,
> and
> > > > > somehow I feel it smells (I need this amount of code because each
> step
> > > > > in the fluent interface above returns a different object via
> interface
> > > > > (e.g. IFindQueryPart).
> >
> > > > > One important thing is that the SetupResult must chain the methods
> in
> > > > > exactly the way they've been chained in the call (for example Order
> > > > > must be chained to Group and not vice versa).
> >
> > > > > Now to aid this, I've written a Lambda expression inspector (simple
> > > > > stuff) which call looks like this:
> >
> > > > > MockFromLambda(repository => repository.Find(some_ICriteria)
> >
> > >  .Order(some_Order)
> >
> > >  .Group(some_Projection_for_group)
> > > > >
>  .All());
> >
> > > > > And it is able to return to me a MethodInfo object for each call in
> > > > > the chain (Find call, Order call, Group call and All call).
> >
> > > > > My question is now... how can I generate a DynamicMock from the
> > > > > information in that MethodInfo? and after that feed that to the
> > > > > SetupResult?
> >
> > > > > The idea would be to dynamically generate the chain of mocks from
> the
> > > > > Lambda expression and chain them all together?
> >
> > > > > Any ideas anyone? Has anyone tried this before?
> >
> > > > > Thanks,
> > > > > Vladan
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Rhino Tools Dev" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/rhino-tools-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to