Here is an adaptation of the solution proposed by Sunny. Thanks for his advice and the steer to the solution for RhinoMocks.
For all tests you have an object called which is all the data that might ever be returned from any of your calls to the repository. In my case this is the users data set:
List<User> users = new List<User>();
Then at each arrange you add new users
users.Add(new User() { username="jim" });
users.Add(new User() { username="jo left ages ago" });
Then you call once to Expect. This sets up any call to the repo to query the data you have provided. For some reason this does not work with two calls to expect. To Rhino Mocks it only appears as if one call has been made:
baseController.UnitOfWork.UserRepository.Expect(u => u.Get(Arg<Expression<Func<User, bool>>>.Is.Anything, Arg<Func<IQueryable<User>, IOrderedQueryable<User>>>.Is.Anything, Arg<string>.Is.Anything))
.WhenCalled(invocation =>
{
var predicate = invocation.Arguments.First() as Expression<Func<User, bool>>;
var query = predicate.Compile();
invocation.ReturnValue = users.Where(query);
});
As an aside, it still doesn't fit nicely with the way calls to SpecFlow's Given statements setup the expectations. What natural statement do you associate with setting up the Expect? But it does answer my original question.