He estado haciendo mi primer proyecto de desarrollo impulsado por prueba recientemente y he estado aprendiendo Ninject y MOQ. Este es mi primer intento de todo esto. Descubrí que el enfoque TDD ha sido estimulante, y Ninject y MOQ han sido geniales. El proyecto en el que estoy trabajando no ha sido particularmente el mejor para Ninject ya que es un programa C# altamente configurable que está diseñado para probar el uso de una interfaz de servicio web.Cómo probar Ninject ConstructorArguments utilizando objetos MOQ?
Lo he dividido en módulos y tengo interfaces en toda la tienda, pero todavía estoy descubriendo que tengo que usar muchos argumentos de constructor cuando obtengo una implementación de un servicio desde el núcleo de Ninject. Por ejemplo;
En mi módulo Ninject;
Bind<IDirEnum>().To<DirEnum>()
Mi DirEnum class;
public class DirEnum : IDirEnum
{
public DirEnum(string filePath, string fileFilter,
bool includeSubDirs)
{
....
En mi clase Configurator (este es el punto de entrada principal) que engancha todos los servicios;
class Configurator
{
public ConfigureServices(string[] args)
{
ArgParser argParser = new ArgParser(args);
IDirEnum dirEnum = kernel.Get<IDirEnum>(
new ConstructorArgument("filePath", argParser.filePath),
new ConstructorArgument("fileFilter", argParser.fileFilter),
new ConstructorArgument("includeSubDirs", argParser.subDirs)
);
filePath, fileFilter e includeSubDirs son opciones de línea de comandos para el programa. Hasta aquí todo bien. Sin embargo, como soy un tipo concienzudo, tengo una prueba que cubre este código. Me gustaría usar un objeto MOQ. He creado un módulo Ninject para mis pruebas;
public class TestNinjectModule : NinjectModule
{
internal IDirEnum mockDirEnum {set;get};
Bind<IDirEnum>().ToConstant(mockDirEnum);
}
Y en mi prueba lo uso así;
[TestMethod]
public void Test()
{
// Arrange
TestNinjectModule testmodule = new TestNinjectModule();
Mock<IDirEnum> mockDirEnum = new Mock<IDirEnum>();
testModule.mockDirEnum = mockDirEnum;
// Act
Configurator configurator = new Configurator();
configurator.ConfigureServices();
// Assert
here lies my problem! How do I test what values were passed to the
constructor arguments???
Así que lo anterior muestra mi problema. ¿Cómo puedo probar qué argumentos pasaron a los ConstructorArguments del objeto simulado? ¿Adivino que Ninject está prescindiendo de los Argumentos del Constuctor en este caso ya que el Enlazador no los requiere? ¿Puedo probar esto con un objeto MOQ o necesito codificar manualmente un objeto simulado que implemente DirEnum y acepte y 'registre' los argumentos del constructor?
n.b. este código es código 'de ejemplo', es decir, no he reproducido mi código al pie de la letra, pero creo que he expresado lo suficiente como para transmitir los problemas. Si necesita más contexto, ¡por favor pregunte!
Gracias por mirar. Sea amable, esta es mi primera vez ;-)
Jim
¿Qué hace DirEnum? Mi regla general es tomar dependencias de "tiempo de compilación" a través de parámetros de constructor y dependencias de "tiempo de ejecución" a través de parámetros de método. Como 'filePath', 'fileFilter' y 'includeSubDirs' son argumentos de línea de comandos, los considero como una dependencia de "tiempo de ejecución" y, por lo tanto, deben pasarse como parámetros de método al método que los necesita. – mrydengren
@mrydengren: me gusta el sonido de eso: "tiempo de compilación para el constructor y tiempo de ejecución para los parámetros del método". – Steven