使用UnitofWork Pattern的Rhino Mock Entity Framework无法正常工作

这是我第一次尝试这样的事情,所以希望这很简单。

我创建了一个WCF服务,它使用Entity Framework来访问数据库。 我已经实现了UnitOfWork接口,因此我的服务可以使用EF,同时仍然可以测试。

这是我的服务:

public class ProjectService : IProjectService { private IUnitOfWork db = null; public ProjectService(IUnitOfWork unitofwork) { db = unitofwork; } public int RegisterSite(int CPUID) { if (db.Servers.Count(x => x.CPUID == CPUID) > 0) { // do something } return 0; } } 

这是我的UnitOfWork界面:

 public interface IUnitOfWork { IObjectSet Clients { get; } IObjectSet Servers { get; } IObjectSet Sites { get; } IObjectSet ServerLogs { get; } void Commit(); } 

当我将此服务与SQLUnitOfWork (使用EF)或InMemoryUnitOfWork (仅在内存对象中)的具体实现SQLUnitOfWork使用时,它可以正常工作。

在我的内存对象测试完成后,我尝试了这个测试。

 [Test] public void RegisterAnExistingServer() { MockRepository mocks = new MockRepository(); IUnitOfWork MockUnitOfWork = mocks.DynamicMock(); ProjectService service = new ProjectService(MockUnitOfWork); Expect.Call(MockUnitOfWork.Servers.Count(x => x.CPUID == 1234)).Return(0); mocks.ReplayAll(); int NewSiteID = service.RegisterSite(1234); mocks.VerifyAll(); } 

但是当我尝试在Rhino Mock中使用它与Servers.Count上的期望时,我得到以下错误:

 System.ArgumentNullException : Value cannot be null. Parameter name: arguments at System.Linq.Expressions.Expression.RequiresCanRead(Expression expression, String paramName) at System.Linq.Expressions.Expression.ValidateOneArgument(MethodBase method, ExpressionType nodeKind, Expression arg, ParameterInfo pi) at System.Linq.Expressions.Expression.ValidateArgumentTypes(MethodBase method, ExpressionType nodeKind, ref ReadOnlyCollection`1 arguments) at System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, IEnumerable`1 arguments) at System.Linq.Queryable.Count(IQueryable`1 source, Expression`1 predicate) 

我究竟做错了什么??

MikeEast是对的。 Rhino.Mocks不做递归模拟。 您需要模拟Servers属性以返回一些内容(只需创建一个空的IObjectSet 并将其设置为返回值)。

此外,你不想对lambdas设定期望。 一旦编译完所有代码,代码中的lambda和unit testing中的lambda就是两种完全不同的方法(并且你的期望总是会失败)。 有关详细信息,请参阅http://groups.google.com/group/rhinomocks/msg/318a35ae7536d90a 。

内部可能会有一些反思,因此您无法直接致电您的工作单位。

我强烈建议切换到nhibernate。 还有,沟渠WCF。