unit test mock framework c# entity-framework testing moq

c# - test - mock entity framework



Entity Framework 4.3 y Moq no pueden crear simulacros de DbContext (2)

Este tipo de excepción generalmente indica que el miembro que está tratando de anular no está expuesto como parte de la interfaz pública en el ensamblado dado (o tal vez para ser más preciso, el ensamblaje prioritario no lo ve ). Y si echamos un vistazo a la implementación de CallValidateEntity en EntityFramework 4.3:

internal virtual DbEntityValidationResult CallValidateEntity( DbEntityEntry entityEntry, IDictionary<object, object> items) { return this.ValidateEntity(entityEntry, items); }

De hecho, notamos que este método es internal y, como resultado, se incluye en la categoría no reemplazable ( no invalidable porque no se utiliza ningún atributo InternalsVisibleTo ). Esto se corresponde naturalmente con la entrada adecuada de metadatos:

Method #20 (06000a03) ------------------------------------------------------- MethodName: CallValidateEntity (06000A03) Flags : [Assem] [Virtual] [HideBySig] [NewSlot] (000003c3)

No está claro por qué Moq intenta anular ese miembro ... considerando que no debería verlo en primer lugar.

Envolver su contexto en una interfaz y exponer solo los métodos que realmente usa es una opción viable; debería ser suficiente para que su prueba pase.

La siguiente prueba que estaba trabajando con EF 4.2 ahora arroja la siguiente excepción con EF 4.3

System.ArgumentException: Type to Mock debe ser una interfaz o una clase abstracta o no sellada. ----> System.TypeLoadException: Método ''CallValidateEntity'' en el tipo ''Castle.Proxies.DbContext43Proxy'' del ensamblado ''DynamicProxyGenAssembly2, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null'' está anulando un método que no es visible desde esa asamblea.

[Test] public void CanCreateMoqTest() { // Arrange Mock<DbContext43> mock; // Act mock = new Mock<DbContext43>(); // Assert Assert.NotNull(mock.Object); } public class DbContext43:DbContext { }

¿Que debería hacer? Crear una interfaz para mi DbContext43?

¿Es esto un cambio de ruptura entre 4.2 y 4.3?

¡¡Gracias!!


Gracias por encontrar esto. El problema está causado por los atributos InternalsVisibleTo que eliminamos de la versión EF 4.2 pero dejamos para EF 4.3. Esto permitió a Moq (que usamos para nuestras pruebas) ver las partes internas de EntityFramework.dll. Sin embargo, como su ensamblado no puede ver esas partes internas, terminó con la excepción.

Planeamos hacer un lanzamiento de parche de EF 4.3 en las próximas semanas y retiraremos InternalsVisibleTo de esta versión, después de lo cual la burla debería funcionar nuevamente.

Actualización: Esto ahora está arreglado en EF 4.3.1 (y EF 5.0-beta1) lanzado hoy. Actualiza tu paquete NuGet para obtener la solución. Consulte http://blogs.msdn.com/b/adonet/archive/2012/02/29/ef4-3-1-and-ef5-beta-1-available-on-nuget.aspx para obtener más información.