Eu tenho em meu conjunto de testes um teste mais ou menos assim:
[Fact]
public void VerifySomeStuff()
{
var stuffCollection = GetSomeStuff();
Assert.Equal(1, stuffCollection.Count());
}
Este teste funciona como eu esperava, mas quando eu o executo, o xUnit imprime um aviso:
aviso xUnit2013: Não use Assert.Equal () para verificar o tamanho da coleção.
No entanto, nenhuma alternativa é sugerida no aviso, e uma pesquisa no Google me leva ao código-fonte em xUnit para o teste que verifica se esse aviso foi impresso.
Se Assert.Equal()
não é a maneira correta de verificar o comprimento de uma coleção, qual é?
Para esclarecer: eu percebi que poderia "enganar" o xUnit para não emitir esse aviso, por exemplo, extraindo uma variável ou usando Assert.True(stuff.Count() == 1)
. O último é apenas hacky, e o primeiro parece que se o xUnit está, por exemplo, tentando evitar múltiplas iterações de um IEnumerable<T>
, então este é o caminho errado a seguir (porque vou obter dicas do compilador sobre isso separadamente se for um problema), e xUnit em si nunca deve ter que avaliar a entrada mais de uma vez (na verdade, provavelmente obterá a mesma entrada, independentemente da extração de variável, por causa de como funciona a chamada de função C #).
Portanto, não estou apenas interessado em remover esse aviso de minha saída. Uma resposta à minha pergunta também explica por que esse aviso está incluído na biblioteca em primeiro lugar e por que qualquer abordagem que eu deveria usar é melhor.
stuffCollection.Count()
em uma variável separada e passá-la para o assert, terá o mesmo erro?Respostas:
O Xunit oferece soluções rápidas para a maioria de seus avisos, então você deve ser capaz de ver o que ele considera "certo".
No seu caso, ele quer que você use,
Assert.Single
já que está esperando exatamente um item. Se você estivesse declarando um número arbitrário, como 412, não seria um aviso sobre o usoCount
. Ele só irá sugerir o usoSingle
se você estiver esperando um item ouEmpty
se não estiver esperando nenhum item.fonte
Empty
,Single
eNotEmpty
- se você espera um valor dinâmico xUnit2013 não deve ser acionado.Eu descobri que isso me dá o mesmo erro:
E lançá-lo impediu o erro de aparecer.
fonte
Para um único elemento em uma lista, é melhor usar isso:
Assert.Single(resultList);
fonte
Eu tive o mesmo problema quando usei a propriedade Count conforme abaixo no xUnit.
Depois de usar a função Count () na coleção, meu problema foi corrigido.
fonte