这是我在这样的第一次尝试,所以希望这是简单的。犀牛模拟实体框架使用的UnitOfWork模式不工作
我创建了一个使用实体框架访问数据库的WCF服务。我已经实现了一个接口,因此我的服务可以使用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<tblClient> Clients { get; }
IObjectSet<tblServer> Servers { get; }
IObjectSet<tblSite> Sites { get; }
IObjectSet<tblServerLog> ServerLogs { get; }
void Commit();
}
当我使用这项服务的SQLUnitOfWork
(使用EF)或用InMemoryUnitOfWork
无论是具体实现(只是在内存对象),那么它工作正常。
经过测试罚款与我的记忆对象我试过这个测试。
[Test]
public void RegisterAnExistingServer()
{
MockRepository mocks = new MockRepository();
IUnitOfWork MockUnitOfWork = mocks.DynamicMock<IUnitOfWork>();
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();
}
但是当我尝试使用它在犀牛模拟与预期的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)
我在做什么错?
也许错误是指'Servers'为空。我想你也必须设定这一点。 – 2011-03-17 06:32:34
所以我加了这一行 'MockUnitOfWork.Servers = mocks.StrictMock>();'仍然是同样的错误。这是你的意思吗? –
2011-03-17 06:40:32
一个建议是,我不会使用Record and Playback语法,因为它已被首选的Arrange-Act-Assert样式所取代。使用RhinoMocks,由于API处于相同的命名空间中(我上次检查过),很难区分它们。 – aqwert 2011-03-17 07:57:49