2011-03-17 19 views
5

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 ??

+2

Quizás el error se refiere a que 'Servers' es nulo. Creo que tienes que configurar eso también. –

+0

, así que agregué esta línea 'MockUnitOfWork.Servers = mocks.StrictMock >();' y sigue siendo el mismo error. ¿Es eso lo que querías decir? –

+0

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

Respuesta

4

MikeEast es correcto. Rhino.Mocks no hace burla recursiva. Necesita simular la propiedad de Servidores para devolver algo (simplemente cree un IObjectSet < tblServer vacío > y configúrelo como el valor de retorno).

Además, no desea establecer expectativas en lambdas. Una vez que todo se compila, la lambda en su código y la lambda en su prueba unitaria son dos métodos totalmente diferentes (y su expectativa siempre fallará). Ver http://groups.google.com/group/rhinomocks/msg/318a35ae7536d90a para más detalles.

-6

Probablemente haya algo de reflexión internamente y por lo tanto no recibirá una llamada directa a su unidad de trabajo.

Sugiero cambiar a nhibernate. Además, abandone WCF.

+0

¿Puedes por favor elaborar? También WCF y EF son los marcos que estamos usando y no podemos cambiar. –

+3

El hecho de que no sepas la respuesta doenst significa que los marcos que está usando son malos y ¡debe cambiar! ¿Cómo se le permite tener esta reputación con respuestas como esta? –

+0

Tengo esta reputación porque la gente vota por mis respuestas. Compare nhibernate (caché de primer y segundo nivel, puntos de extensión, bases de datos múltiples, etc.) con EF y verá. Luego eche un vistazo a algo como ServiceStack (en la configuración del código, mantenimiento fácil de enviar) y compárelo con WCF. La pregunta era "¿Qué estoy haciendo mal?" Sugiriendo que NH y SS son aplicables. –

Cuestiones relacionadas