Tengo esta firma de método: List<ITMData> Parse(string[] lines)
Cómo probar de manera efectiva un analizador de archivos planos de longitud fija utilizando MSpec?
ITMData
tiene 35 propiedades.
¿Cómo podría efectivamente probar tal analizador?
Preguntas:
- ¿Debo cargar el archivo completo (¿Puedo usar System.IO)?
- ¿Debo poner una línea del archivo en una constante de cadena?
- ¿Debo probar una o más líneas
- ¿Debo probar cada propiedad de ITMData o debería probar el objeto completo?
- ¿Qué pasa con el nombramiento de mi prueba?
EDITAR
me cambió la firma del método a ITMData Parse(string line)
.
Código de prueba:
[Subject(typeof(ITMFileParser))]
public class When_parsing_from_index_59_to_79
{
private const string Line = ".........";
private static ITMFileParser _parser;
private static ITMData _data;
private Establish context =() => { _parser = new ITMFileParser(); };
private Because of =() => { _data = _parser.Parse(Line); };
private It should_get_fldName =() => _data.FldName.ShouldBeEqualIgnoringCase("HUMMELDUMM");
}
EDIT 2
todavía no estoy seguro de si debo probar únicamente una propiedad por clase. En mi opinión, esto me permite dar más información para la especificación, concretamente que cuando analizo una sola línea del índice 59 al índice 79 obtengo fldName. Si pruebo todas las propiedades dentro de una clase I pierda esta información. ¿Estoy sobreespecificando mis pruebas?
mis pruebas ahora se ve así:
[Subject(typeof(ITMFileParser))]
public class When_parsing_single_line_from_ITM_file
{
const string Line = ""
static ITMFileParser _parser;
static ITMData _data;
Establish context =() => { _parser = new ITMFileParser(); };
private Because of =() => { _data = _parser.Parse(Line); };
It should_get_fld??? =() => _data.Fld???.ShouldEqual(???);
It should_get_fld??? =() => _data.Fld???.ShouldEqual(???);
It should_get_fld??? =() => _data.Fld???.ShouldEqual(???);
It should_get_fld??? =() => _data.Fld???.ShouldEqual(???);
It should_get_fld??? =() => _data.Fld???.ShouldEqual(???);
It should_get_fld??? =() => _data.Fld???.ShouldEqual(???);
It should_get_fld??? =() => _data.Fld???.ShouldEqual(???);
...
}
¿Qué quiere decir con "eficacia" exactamente? ¿Desea minimizar el tiempo de desarrollo de las pruebas unitarias? –
bien, es decir, ¿está probando con una cuerda o con muchas cuerdas? probando con una cadena que contiene solo los valores que quiero afirmar o tomar toda la cadena. – Rookian
Todavía no estoy 100% seguro de cuál es exactamente la pregunta, pero crearía un conjunto de diferentes pruebas de unidad. Un método de prueba puede pasar en una única cadena específica y afirmar que se ha analizado correctamente en las propiedades relevantes en el objeto IMTData resultante. Quizás otra prueba que pruebe que, dadas 20 líneas, produzca una Lista de 20 elementos. Es posible que tenga otros métodos para casos difíciles específicos. Esto es más o menos lo que describió @Kenny, cosas básicas para probar la unidad. Tome los requisitos para este método de Parse y realice una ingeniería inversa en algunos casos de prueba que demuestren la corrección. –