Este es mi primer intento de algo así, así que espero que esto sea simple.Rhino Mock Entity Framework utilizando UnitofWork Patrón no funciona
He creado un servicio WCF que utiliza Entity Framework para acceder a la base de datos. Implementé una interfaz UnitOfWork, por lo que mi servicio puede usar EF mientras aún se puede probar.
Aquí es mi servicio:
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;
}
}
Aquí es mi interfaz UnitOfWork:
public interface IUnitOfWork
{
IObjectSet<tblClient> Clients { get; }
IObjectSet<tblServer> Servers { get; }
IObjectSet<tblSite> Sites { get; }
IObjectSet<tblServerLog> ServerLogs { get; }
void Commit();
}
Cuando utilizo este servicio, ya sea con implementaciones concretas de un SQLUnitOfWork
(usando EF) o con un InMemoryUnitOfWork
(solo en objetos de memoria) entonces funciona bien.
Después de probar bien con mi en objetos de memoria intenté esta prueba.
[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();
}
Pero cuando trato de usarlo en Rhino Mock con una expectativa de Servers.Count me sale el siguiente error:
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)
¿Qué estoy haciendo mal ??
Quizás el error se refiere a que 'Servers' es nulo. Creo que tienes que configurar eso también. –
, así que agregué esta línea 'MockUnitOfWork.Servers = mocks.StrictMock>();' y sigue siendo el mismo error. ¿Es eso lo que querías decir? –
Una sugerencia, no usaría la sintaxis Grabar y Reproducir, ya que ha sido superada por el estilo Arrange-Act-Assert preferido. Con RhinoMocks puede ser difícil distinguirlos debido a que la API está en el mismo espacio de nombres (la última vez que revisé). – aqwert