Tengo en mi suite de pruebas una prueba que es algo como esto:
[Fact]
public void VerifySomeStuff()
{
var stuffCollection = GetSomeStuff();
Assert.Equal(1, stuffCollection.Count());
}
Esta prueba funciona como esperaba, pero cuando la ejecuto, xUnit imprime una advertencia:
advertencia xUnit2013: No use Assert.Equal () para verificar el tamaño de la colección.
Sin embargo, no se sugiere ninguna alternativa en la advertencia, y una búsqueda en Google me lleva al código fuente en xUnit para la prueba que verifica que esta advertencia esté impresa.
Si Assert.Equal()
no es la forma correcta de verificar la longitud de una colección, ¿cuál es?
Para aclarar: me doy cuenta de que podría "engañar" a xUnit para que no emita esta advertencia, por ejemplo, extrayendo una variable o usando en su Assert.True(stuff.Count() == 1)
lugar. El último es simplemente hacky, y el primero parece que si xUnit está, por ejemplo, tratando de evitar múltiples iteraciones de un IEnumerable<T>
, entonces este es el camino equivocado (porque obtendré sugerencias del compilador sobre eso por separado si es un problema), y xUnit en sí mismo nunca debería tener que evaluar la entrada más de una vez (de hecho, probablemente obtendrá la misma entrada independientemente de la extracción de la variable, debido a cómo funciona la llamada a la función C #).
Entonces, no solo estoy interesado en eliminar esa advertencia de mi salida. Una respuesta a mi pregunta también explica por qué esa advertencia está incluida en la biblioteca en primer lugar y por qué cualquier enfoque que deba usar es mejor.
stuffCollection.Count()
en una variable separada y la pasa a la aserción, ¿le da el mismo error?Respuestas:
Xunit ofrece soluciones rápidas para la mayoría de sus advertencias, por lo que debería poder ver lo que cree que es "correcto".
En su caso, quiere que use
Assert.Single
ya que espera exactamente un artículo. Si estuviera afirmando un número arbitrario, como 412, entonces no le daría una advertencia sobre el usoCount
. Solo sugerirá el usoSingle
si está esperando un artículo oEmpty
si no espera ningún artículo.fuente
Empty
,Single
yNotEmpty
- si se espera un valor dinámico xUnit2013 no deben dar lugar.Encontré que esto me da el mismo error:
Y emitirlo evitó que apareciera el error.
fuente
Para un solo elemento en una lista, es mejor usar esto en su lugar:
Assert.Single(resultList);
fuente
Tuve el mismo problema cuando usé la propiedad Count como se muestra a continuación en xUnit.
Después, uso la función Count () en la colección, solucionó mi problema.
fuente