Zomba de Rinoceronte:Como faço para retornar números de uma sequência
-
09-06-2019 - |
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?
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;
}
}