c# - ¿Las falsificaciones son mejores que Mocks?




unit-testing mocking fakeiteasy (5)

Desde mi punto de vista, Fake no cancela el Moc, por ejemplo, uso Dev Magic Fake para falsificar DAL y Business y al mismo tiempo utilizo Mock en MVC para HTTPContext

var repoistory = new FakeRepository<ProductTypeForm, VendorForm>();
            repoistory.Save(productTypeForm);
            this.FillDropDown(new FakeRepository<VendorForm>());

En el código anterior, Dev Magic Fake guardará el ProductTypeForm y recuperará el VendorForm de Dev Magic Fake y lo vinculará a ProductTypeForm, esta operación de salvar puede ser permanente.

Para obtener más información sobre Dev Magic Fake, véalo en CodePlex: http://devmagicfake.codeplex.com

Para probar este método, tenemos que burlarnos del contexto HTTP

var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();

Así que trabajo con falso y simulacro

Me encontré con este proyecto de código abierto Fake It Easy , y tengo que admitir que se ve muy interesante, sin embargo tengo mis dudas, ¿cuál es la diferencia entre FIE falsificaciones y decir Moq Mocks? ¿Hay alguien mejor para usos particulares?

EDITAR:

¿De qué se trata este nuevo marco que lo haría mejor que decir Moq?


La terminología utilizada en las pruebas puede ser un poco confusa. La mejor fuente que explica la diferencia entre los diferentes conceptos es Mocks Are not Stubs de Martin Fowler. En resumen, fake es un término genérico que describe tanto stubs como mocks.


Para ser claros, creé FakeItEasy, así que definitivamente no diré si un marco es mejor que el otro, lo que sí puedo hacer es señalar algunas diferencias y motivar por qué creé FakeItEasy. Funcionalmente no hay diferencias importantes entre Moq y FakeItEasy.

FakeItEasy no tiene "Verificables" o "Expectativas", tiene aseveraciones, sin embargo, éstas siempre se establecen explícitamente al final de una prueba, creo que esto hace que las pruebas sean más fáciles de leer y comprender. También ayuda a los principiantes a evitar afirmaciones múltiples (donde establecerían expectativas en muchas llamadas o simulacros de objetos).

Antes usaba Rhino Mocks y me gustó bastante, especialmente después de que se introdujo la sintaxis AAA. Sin embargo, me gustó mucho mejor la fluida API de Moq. Lo que no me gustó de Moq fue el "objeto falso" en el que tienes que usar el simulacro. Objeto en todas partes, me gusta más el enfoque de Rhino con burlas "naturales". Cada instancia se ve y se siente como una instancia normal del tipo falso. Quería lo mejor de ambos mundos y también quería ver qué podía hacer con la sintaxis cuando tenía manos libres. Personalmente, (obviamente) creo que he creado algo que es una buena combinación con lo mejor de ambos mundos, pero eso es bastante fácil cuando estás sobre los hombros de gigantes.

Como se mencionó aquí, una de las principales diferencias está en la terminología, FakeItEasy fue creado para introducir TDD y burlas a los principiantes y tener que preocuparse por las diferencias entre los simulacros y los talones por adelantado (como debería hacerlo en Rhino) es no es muy útil en mi opinión.

He puesto mucho énfasis en los mensajes de excepción, debería ser muy fácil decir qué le pasa en una prueba solo mirando un mensaje de excepción.

FakeItEasy tiene algunas características de extensibilidad que los otros marcos no tienen, pero estos aún no están muy bien documentados.

FakeItEasy es (con suerte) un poco más fuerte en burlarse de las clases que tiene argumentos de constructor ya que tiene un mecanismo para resolver los valores ficticios a usar. Incluso puede especificar sus propias definiciones de valores ficticios implementando una clase DummyDefinition (Of T) dentro de su proyecto de prueba, FakeItEasy lo recogerá automáticamente.

La sintaxis es una diferencia obvia, que una mejor es en gran medida una cuestión de gusto.

Estoy seguro de que hay muchas otras diferencias de las que me olvido ahora (y para ser justos, nunca he usado Moq en producción, así que mi conocimiento es limitado), creo que estas son las diferencias más importantes.


La terminología de burlarse puede ser confusa, y a veces es bastante poco intuitiva.

Por lo tanto, muchas personas propusieron una terminología más simple y nueva, donde solo tiene falsificaciones , simulaciones y resúmenes .

Fake es el término genérico para todos los posibles tipos de dobles de prueba, sin importar de dónde vienen ni cómo se usan.

Más allá de eso, las falsificaciones se distinguen solo a lo largo de una sola dimensión: si influyen en el resultado de la prueba o no; o, en otras palabras: si tiene que configurar valores devueltos para el falso, que de alguna manera se usan durante la ejecución de la prueba, o si es un objeto " silencioso " que solo sirve para cumplir alguna dependencia.

Trozo es ese objeto ' silencioso '.

Se burla de que participa activamente en la ejecución de la prueba

Más allá de eso, no hay más distinción, que seguramente tiene sus méritos históricos, pero ahora es en gran medida contraintuitiva y académica, y está ofuscando conceptos realmente importantes del desarrollo impulsado por las pruebas.

Con respecto a la comparación entre Moq y FakeItEasy : los dos marcos son en gran medida los mismos desde un punto de vista conceptual: las diferencias están solo en la API y en la terminología ...

Thomas


El JMockit contiene mucha información comparativa para los kits de herramientas de JMockit actuales.

En particular, revise la matriz de comparación de características , que cubre EasyMock, jMock, Mockito, Unitils Mock, PowerMock y, por supuesto, JMockit. Trato de mantenerlo preciso y actualizado, tanto como sea posible.





c# unit-testing mocking fakeiteasy