2010-10-22 6 views
49

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?¿Las falsificaciones son mejores que Mocks?

EDIT:

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

+0

Para un tipo totalmente diferente de burlas y talones de examinar el marco lunares Microsoft (http: // research.microsoft.com/en-us/projects/moles/). Moles también permite burlarse de clases estáticas, selladas y de terceros. – softveda

Respuesta

86

Para que quede claro, creé FakeItEasy por lo que definitivamente no voy a decir si un marco es mejor que el otro, lo que 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 afirmaciones, 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ó más 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 ha mencionado 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 simulacros y anotaciones (cómo debería hacerlo). en Rhino) no es muy útil en mi opinión.

He puesto mucha atención 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 aunque.

+27

+1 nada supera a una publicación del autor :-) – TheCodeJunkie

+1

Gracias @Patrick! gran respuesta, esto realmente ayuda a entender el razonamiento detrás del proyecto, deberías agregar algo como esto en la wiki, para las personas que ya usan un framework y podrían estar interesadas en cambiar :) por cierto, que tengas dogfood FIE con tu propio código de producción ? –

+2

Sí, dogfood FakeItEasy en mi lugar de trabajo en proyectos a gran escala, lo he estado haciendo durante más de un año. –

23

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 Aren't Stubs por Martin Fowler. En resumen, fake es un término genérico que describe tanto stubs como mocks.

+5

Lol cualquier pregunta con la etiqueta falsa o falsa debe aparecer un "¿has leído el artículo de Martin Fowler" pop-up: P –

+1

Ese enlace de hecho tiene las mejores definiciones para estos términos – softveda

+0

Gran artículo pero hombre que podría preocuparse un poco por el formateo, html simple que abarca toda la pantalla, código sin color ... realmente hace que sea difícil de leer –

9

La terminología en burlarse puede ser confusa, y en ocasiones es bastante poco intuitiva.

Por lo tanto, muchas personas propusieron una nueva terminología más simple, donde sólo tiene falsificaciones, burla, y talones de.

falso es el término genérico para todos los tipos posibles de dobles de prueba, no importa de dónde vienen y cómo se utilizan.

Más allá de eso, falsificaciones se distinguen solo a lo largo de una única 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 'silent' que solo sirve para cumplir con alguna dependencia.

Trozo es que ' silenciosa' objeto.

Mock es participa activamente en la ejecución de pruebas

Más allá de eso, no hay otra distinción - que sin duda tiene sus méritos históricos, pero ahora es en gran parte contra-intuitivo y académica, y es un poco de ofuscar conceptos realmente importantes del desarrollo impulsado por la prueba.

En cuanto a la comparación entre Moq y FakeItEasy: los dos marcos son en gran parte el mismo desde un punto de vista conceptual - los diferencias sólo en el API y en la terminología ...

Thomas

+0

* ¿Quién * propuso la terminología donde "falso es el término genérico"? Sé que la biblioteca FakeItEasy lo usa así, pero eso es todo. Todos los demás autores (Fowler, Meszaros, creadores de otras bibliotecas burlonas) usan "falso" para un doble tipo de prueba (diferente de los resguardos y simulacros), o no usan este nombre (por ejemplo, no hay nada). nombrado "falso" en jMock, EasyMock o Mockito). –

-2

Desde mi punto de vista falso no se cancela la Moc, por ejemplo, yo uso falso Dev magia a DAL falsa y la capa de negocios y en el mismo tiempo que utilizo falsa en el MVC para para HttpContext

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

En el código anterior Dev mágico falso salvará al ProductTypeForm y recuperar la VendorForm de falso Dev magia y vincularlo a ProductTypeForm, esta operación de almacenamiento puede ser permanente

para más inforamtion acerca de Fake Dev magia verlo en CodePlex: http://devmagicfake.codeplex.com

prueba de este método de Te tenemos que imita el contexto HTTP

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

por lo que trabajo con falsa y fingida

+0

Parece más interesado en publicitar su propio proyecto, en lugar de responder la pregunta ... – SamuelKDavis

Cuestiones relacionadas