2011-03-29 17 views
7

He visto algunas preguntas aquí de personas que piden críticas por sus pruebas unitarias. No parece que se cierren, así que me gustaría hacer lo mismo.Uso dinámico con pruebas unitarias

Aumenté estas pruebas, que creo que se hacen más legibles mediante el uso de dynamic, pero me preguntaba si alguien en la comunidad SO tenía algo que agregar.

Sé que el uso de la dinámica es, por alguna razón, muy controvertido, y por alguna razón comienza guerras de religión entre los desarrolladores de C#. Realmente espero evitar eso; Sólo estoy tratando de escribir algunas buenas pruebas para ayudar a hacer mi trabajo :)

[TestMethod] 
    public void TestAllocation() { 
     SearchView.StubPropertyNumValueThenSetUpSearchView<WellDetail>("TX", Property.WorkingInterestTaxSubtypeId); 
     Presenter.SetUpPhaseAndFmvValues(Phase.PhaseIdForForRenderAppraiser, 1000); 

     AddTheseItems(
      new { PropNum = "pn1", CAN = "can1", MostRecentFmv = 10 }, 
      new { PropNum = "pn1", CAN = "can1", MostRecentFmv = 10 }, 
      new { PropNum = "pn1", CAN = "can1", MostRecentFmv = 10 }, 
      new { PropNum = "pn1", CAN = "can1", MostRecentFmv = 10 }, 

      new { PropNum = "pn1", CAN = "can2", MostRecentFmv = 40 }, 
      new { PropNum = "pn1", CAN = "can2", MostRecentFmv = 40 }, 
      new { PropNum = "pn1", CAN = "can2", MostRecentFmv = 40 }, 

      new { PropNum = "pn2", CAN = "can1", MostRecentFmv = 50 }, 
      new { PropNum = "pn2", CAN = "can1", MostRecentFmv = 50 }); 

     Presenter.Process(SearchView, ItemsToProcess); 

     AssertTheseItemsExist(
      new { NumberOfTimes = 4, PropNum = "pn1", CAN = "can1", FmvCalculated = 100 }, 
      new { NumberOfTimes = 3, PropNum = "pn1", CAN = "can2", FmvCalculated = 400 }, 
      new { NumberOfTimes = 2, PropNum = "pn2", CAN = "can1", FmvCalculated = 500 }); 
    } 

    private void AddTheseItems(params dynamic[] MassUpdateDtos) { 
     foreach(dynamic item in MassUpdateDtos) 
      ItemsToProcess.Add(new MassFMVUpdateDTO(new WellDetail() { PropertyNum = item.PropNum, CountyAccountNum = item.CAN }, new FMVHistory(), 0, item.MostRecentFmv)); 
    } 

    private void AssertTheseItemsExist(params dynamic[] uniqueTargets) { 
     foreach (dynamic target in uniqueTargets) 
      Assert.AreEqual(target.NumberOfTimes, ItemsToProcess.Count(f => f.PropertyNum == target.PropNum && f.CountyAccountNum == target.CAN && f.FMV == target.FmvCalculated)); 
    } 
+0

¿Cuál es la ventaja de usar 'dynamic' en su caso? –

+0

En general no encuentro ningún problema con esto y me inclino anti-dinámico. La pregunta que haré es: ¿realmente salvaste algo al no crear una pequeña clase privada con propiedades automáticas para PropNum, CAN, etc.? Todavía está estrechamente vinculado entre la creación de los tipos anónimos y su uso, y el compilador no lo ayudará. Si eres bueno con eso, y tu equipo es bueno con eso, entonces ve por ello. –

+2

@Daniel Creo que solo hace que las pruebas sean mucho más legibles; los enfoca en las piezas de datos particulares que son relevantes. El método AddTheseItems muestra cuán inflada sería la prueba si tuviera que usar los objetos apropiados, tipados estáticamente (IMO). –

Respuesta

2

Claro que el uso de dinámica reduce las líneas de código que necesita para su uso. Pero piense primero en lo que quiere de las pruebas unitarias. Desea que le digan dónde se equivoca su código.

Si una de las filas de datos que agrega es incorrecta, ¿le dirá cuál falló? Y si una de las afirmaciones falla, ¿le dirá cuál?

Mientras pueda obtener la información que necesita, debería estar bien. Entonces debería decir exactamente qué salió mal y cuándo lo hizo.

+0

+1 Ese es un buen punto. De lo que no puedo decir ni cómo lo tengo ahora, ni cómo sería si añadiera en clases simples para evitar la dinámica, me diría específicamente qué fila causó la falla. Para mí, espero que la prueba pase mucho más de lo que espero que falle, por lo que me parece que puedo pasar a la prueba si alguna vez refactorizo ​​mi código de modo que la prueba se rompa. ¿Eso suena como un razonamiento decente? –

+0

Exactamente, usted escribe que las pruebas de la unidad también detectan errores, cuando hacen eso, quieren que le muestren dónde está el error. – MrFox