Olá Daniel, boa tarde.
Obrigado pelo retorno. Entendi.
Pensando em sua orientação cheguei no resultado abaixo:
Criei um novo método estático para retornar os dados complexos a serem testados. Um array de object que contém o valor esperado, um array de interessados (aproveitei para incluir os interessados dessa forma também), um array de ofertas e a instância de Leilao (variando a modalidade). Então:
public static IEnumerable<object[]> Dados()
{
var leilaoMaiorValor = new Leilao("Picasso", new MaiorValor());
var leilaoOfertaProxima = new Leilao("Picasso", new OfertaSuperiorMaisProxima(1200));
return new List<object[]>
{
new object[]
{
1200,
new Interessada[] { new Interessada("Participante 1", leilaoMaiorValor ), new Interessada("Participante 2", leilaoMaiorValor) },
new double[] {800, 900, 1000, 1200}, leilaoMaiorValor },
new object[] {
1210,
new Interessada[] { new Interessada("Participante 1", leilaoOfertaProxima ), new Interessada("Participante 2", leilaoOfertaProxima) },
new double[] {800, 1190, 1210, 1400}, leilaoOfertaProxima
}
};
}
Com isso, criei um novo método de teste chamado: RetornaLanceGanhadorDadoLeilaoComDoisInteressadosDeVariasModalidadesEVariosLances utilizando os dados retornados através do método estático. Fiz um pequeno ajuste para considerar os interessados corretamente dentro do for de ofertas e não precisei mais instanciar Leilao. Ficando assim:
[Theory]
[MemberData(nameof(Dados))]
public void RetornaLanceGanhadorDadoLeilaoComDoisInteressadosDeVariasModalidadesEVariosLances(
double valorEsperado,
Interessada[] interessadas,
double[] ofertas,
Leilao leilao)
{
//Arrange - cenário
leilao.IniciaPregao();
for (int i = 0; i < ofertas.Length; i++)
{
var valor = ofertas[i];
if ((i % 2) == 0)
{
leilao.RecebeLance(interessadas[0], valor);
}
else
{
leilao.RecebeLance(interessadas[1], valor);
}
}
//Act - método sob teste
leilao.TerminaPregao();
//Assert
var valorObtido = leilao.Ganhador.Valor;
Assert.Equal(valorEsperado, valorObtido);
}
O que acha?