2010-09-10 11 views
6

¿Cómo puedo moler el DataContext que estoy usando en una clase para escribir mensajes en una tabla. Me gustaría afirmar que la tabla con la que LINQ está escribiendo tiene el recuento esperado de mensajes. Esto es lo que tengo hasta ahora.Moling DataContext con MS Moles?

var context = new MJustTestingDataContext(); 
MyMessagewriter writer = new MyMessageWriter(context); 

var messageList = new List<MIncmoingMessage>(); 
MTable<MIncomingMessage> messageTable = new MTable<MIncomingMessage>(); 
messageTable.Bind(messagesLinqList.AsQueryable()); 

Si utilizo este código con xUnit en mi clase que se está probando voy a conseguir esta excepción

Microsoft.Moles.Framework.Moles.MoleNotImplementedException: DataContext.Dispose() was not moled. 

Qué me estoy perdiendo aquí y cómo implementar DataContext.Dispose() en el muelle? Estoy usando moles independientes sin Pex.

Respuesta

3

Cuando crea un nuevo topo, el comportamiento predeterminado para sus métodos y propiedades es arrojar un MoleNotImplementedException cada vez que se invocan.

Para implementar el topo, puede hacer context.Dispose =() => {};, lo que significa que no ocurre nada cuando se llama al método Dispose en la instancia de moled. He vuelto a leer la pregunta y probablemente tenga un problema ya que Dispose se define en una clase base. A mol método de base que tiene que hacer lo siguiente:

var context = new MJustTestingDataContext(); 
var baseContext = new MDataContext(context); 

baseContext.Dispose =() => {}; 

Tendrá que aplicar cada propiedad/método que es llamada por el código bajo prueba o puede establecer el comportamiento predeterminado de la instancia a nivel mundial mediante el topo método BehaveAsDefaultValue. De esta forma, cada método en el topo no hará nada y devolverá el valor predeterminado para su tipo de devolución si existe en lugar de arrojar un MoleNotImplementedException. Sin embargo, si requiere este comportamiento, es mejor usar un stub que un mole.

+0

que tenían el mismo problema, esta es la respuesta correcta – omatase

0

Tengo problemas para entender lo que hace la prueba. Ayer tuve que hacer algo similar, así que compartiré mi experiencia. En primer lugar, es importante comprender que no necesita usar todos los MoleTypes para probar su código; solo necesita usar Moles para redirigir ciertas partes de su código a expresiones lambda. Dado un método que hace esto:

  1. obtener una lista de usuarios para modificar la base de datos
  2. modificar todos los usuarios en el conjunto
  3. enviar el nuevo conjunto de vuelta a la base de datos

I Me gustaría redirigir 1 y 3 para no usar la base de datos. Por ejemplo, puedo redirigir la llamada a SubmitChanges (3) a través de este código:

bool hitSubmitChanges = false; 
int changeCount = 0; 
IList<object> updates = null; 

// more code here... 

    // redirect DataContext.SubmitChanges() to a lambda to catch updates 
    MDataContext.AllInstances.SubmitChanges = (c) => 
    { 
    changeCount = c.GetChangeSet().Updates.Count; 
    updates = c.GetChangeSet().Updates; 
    hitSubmitChanges = true; 
    }; 

Eso (y la llamada para obtener los usuarios) sería la única Moletypes que haría uso de la prueba. El resto sería normal. Entonces puedo usar aserciones para verificar los valores de changeCount, updates y hitSubmitChanges.

+1

Nota para los demás: MDataContext requiere, como se usa aquí requiere la creación de un topo por System.Data.Linq. – sfuqua

Cuestiones relacionadas