Si tiene clases que implementan una interfaz, todas necesitan implementar los métodos en esa interfaz. Para probar estas clases, necesitas crear una clase de prueba unitaria para cada una de las clases.
Vamos a ir con una ruta más inteligente en su lugar; si su objetivo es evitar el código y la duplicación del código de prueba es posible que desee crear una clase abstracta que maneje el código recurrente.
E.g. usted tiene la siguiente interfaz:
public interface IFoo {
public void CommonCode();
public void SpecificCode();
}
Es posible que desee crear una clase abstracta:
public abstract class AbstractFoo : IFoo {
public void CommonCode() {
SpecificCode();
}
public abstract void SpecificCode();
}
Prueba de que es fácil; implementar la clase abstracta en la clase de prueba, ya sea como una clase interna:
[TextFixture]
public void TestClass {
private class TestFoo : AbstractFoo {
boolean hasCalledSpecificCode = false;
public void SpecificCode() {
hasCalledSpecificCode = true;
}
}
[Test]
public void testCommonCallsSpecificCode() {
TestFoo fooFighter = new TestFoo();
fooFighter.CommonCode();
Assert.That(fooFighter.hasCalledSpecificCode, Is.True());
}
}
... o dejar que la clase de prueba extender la clase abstracta en sí, si que se ajuste a su fantasía.
[TestFixture]
public void TestClass : AbstractFoo {
boolean hasCalledSpecificCode;
public void specificCode() {
hasCalledSpecificCode = true;
}
[Test]
public void testCommonCallsSpecificCode() {
AbstractFoo fooFighter = this;
hasCalledSpecificCode = false;
fooFighter.CommonCode();
Assert.That(fooFighter.hasCalledSpecificCode, Is.True());
}
}
Tener una clase abstracta que se ocupe del código común que una interfaz implica da un diseño de código mucho más limpio.
Espero que esto tenga sentido para usted.
Como nota al margen, este es un patrón de diseño común que se llama la Template Method pattern. En el ejemplo anterior, el método de la plantilla es el método CommonCode
y SpecificCode
se llama un stub o un gancho. La idea es que cualquier persona pueda extender el comportamiento sin la necesidad de conocer las cosas detrás de escena.
Muchos frameworks se basan en este patrón de comportamiento, p. ASP.NET donde tiene que implementar los ganchos en una página o en los controles de un usuario como el método Page_Load
generado que se llama por el evento Load
, el método de la plantilla llama a los ganchos detrás de las escenas. Hay muchos más ejemplos de esto. Básicamente, todo lo que tiene que implementar que utiliza las palabras "cargar", "init" o "renderizar" se llama mediante un método de plantilla.
@Spoike: +1, pero un pequeño inconveniente es que su código no es C#. – user7116
@sixlettervariables: sí, me olvidé de agregar palabra clave virtual y otras cosas. Yo culpo a toda la programación de Java que tuve que hacer al mismo tiempo que escribí esta entrada;) – Spoike
¡Buena respuesta! Actualmente, NUnit admite clases de prueba genéricas y el atributo TestFixture se puede usar para proporcionar los tipos específicos que se utilizarán cuando se ejecute la prueba. Escribí una [publicación de blog] (http://softwareonastring.com/2015/03/22/testing-every-implementer-of-an-interface-with-the-same-tests-using-nunit) sobre cómo probar cada implementador de una interfaz que muestra estas características. –