Pergunta

Eu tenho uma matriz enumerável

int meas[] = new double[] {3, 6, 9, 12, 15, 18};

Em cada chamada sucessiva ao método do mock que estou testando, quero retornar um valor desse array.

using(_mocks.Record()) {
  Expect.Call(mocked_class.GetValue()).Return(meas); 
}
using(_mocks.Playback()) {
  foreach(var i in meas)
    Assert.AreEqual(i, mocked_class.GetValue();    
}

Alguém tem uma ideia de como posso fazer isso?

Foi útil?

Solução

Sempre existe objeto falso estático, mas essa questão é sobre simulações de rinocerontes, então apresento a vocês como farei isso.O truque é criar uma variável local como contador e usá-la em seu delegado/lambda anônimo para controlar onde você está na matriz.Observe que não resolvi o caso de GetValue() ser chamado mais de 6 vezes.

var meas = new int[] { 3, 6, 9, 12, 15, 18 };
using (mocks.Record())
{
    int forMockMethod = 0;
    SetupResult.For(mocked_class.GetValue()).Do(
        new Func<int>(() => meas[forMockMethod++])
        );
}

using(mocks.Playback())
{
    foreach (var i in meas)
        Assert.AreEqual(i, mocked_class.GetValue());
}

Outras dicas

Se a funcionalidade for GetValue() retornando cada elemento da matriz em sucessão, você poderá configurar várias expectativas, por exemplo

using(_mocks.Record()) {
  Expect.Call(mocked_class.GetValue()).Return(3); 
  Expect.Call(mocked_class.GetValue()).Return(6); 
  Expect.Call(mocked_class.GetValue()).Return(9); 
  Expect.Call(mocked_class.GetValue()).Return(12); 
  Expect.Call(mocked_class.GetValue()).Return(15); 
  Expect.Call(mocked_class.GetValue()).Return(18); 
}
using(_mocks.Playback()) {
  foreach(var i in meas)
    Assert.AreEqual(i, mocked_class.GetValue();    
}

O repositório simulado aplicará as expectativas em ordem.

Qualquer razão pela qual você deve ter uma zombaria aqui ...
Se não, eu iria para uma aula falsa.Muito mais simples e eu sei como obtê-lo para fazer isso :) Não sei se estruturas simuladas fornecem esse tipo de comportamento personalizado.

IMHO, o rendimento cuidará disso.Link.

Algo como:

get_next() {
  foreach( float x in meas ) {
    yield x;
  }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top