2011-10-18 19 views
5

Estaba intentando utilizar FakeItEasy recientemente pero no he podido crear una Fake de una clase concreta sin tener que trabajar con muchas peculiaridades.FakeItEasy Crear una falsificación de una clase

He intentado lo siguiente:

public class MyObject { 
public MyObject(){} 
} 
... 
MyObject fakeObject = A.Fake<MyObject>(); 

que resultó en el constructor no encontrado con hacer juego me lo quitaron Excepción

siguiente intenté:

public class MyObject { 
public MyObject(string temp){} 
} 
... 
MyObject fakeObject = A.Fake<MyObject>(x => x.WithArgumentsForConstructor(() => new MyObject("temp"))); 

que resultó en un error similar.

Finalmente he intentado:

public class MyObject { 
//public MyObject(){} 
} 
... 
MyObject fakeObject = A.Fake<MyObject>(); 

Qué me permitió crear, finalmente, el falso. Estoy confundido sobre por qué la mayoría de los ejemplos de falsificación de una clase concreta aluden a que esto es más fácil de lo que he descubierto. ¿Y por qué usar el método documentado, la prueba n. ° 2 anterior, no funcionó?

¿Existen algunas limitaciones para falsificar una clase concreta que no están documentadas?

Respuesta

0

No puedo reproducir el problema, cuando ejecuto código equivalente, funciona para mí. ¿Podría crear una solución vs que reproduzca el problema y submit an issue on GitHub?

1

Reconozco que esta es una pregunta antigua, por lo que estoy publicando esta respuesta para cualquier otra persona que tenga este problema y se tropieza con esta pregunta. Pude replicar un problema similar a esto.

tengo una clase:

public class Service : IService 
{ 
    public Service (int prNum) 
    { 
    //call to a c++ wrapper class (this is where the problem occurs) 
    //some other calls 
    } 
} 

yo estaba tratando de crear la clase de servicio como una falsificación para una prueba de unidad:

private Service fakeServ = A.Fake<Service>((x => x.WithArgumentsForConstructor(() => new Service(3)))); 

que estaba recibiendo el mismo error: Constructor No se ha encontrado con Argumentos coincidentes Excepción

Eventualmente ingresé en la llamada A.Fake con el depurador y encontré el código dentro del constructor (que A.Fake sí llamó) no pudo inicializar un bloque de memoria global debido a que Visual Studio no se ejecuta en modo administrador. (CreateFileMapping, código de error 5, System Error 0x5: CreateFileMapping())

Configuré Visual Studio para que se ejecute como administrador y se resolvió el problema, se creó el falso.

Parece que el Fake, creado con un constructor con parámetros, se ejecuta a través del constructor (que es lo que esperaba evitar creando un falso ya que la memoria global no forma parte del foco de mi prueba unitaria, Tendré que investigar si hay una manera diferente en que debería estar creando esto).

El código que envió no indica que está llamando clases de envoltura o la creación de la memoria global, pero podría intentar entrar en la llamada creación falso con el depurador para ver si el constructor comienza a funcionar y si hay un fallo en el constructor, y qué errores se devuelven.

Cuestiones relacionadas