2010-02-02 2 views
12

Возможно ли изменить параметр вызова метода издевательства? В частности, я хочу изменить buffer в следующем примере на предварительно заполненный массив байтов.Как изменить параметр вызова издевающегося метода с помощью Moq?

Пример:
int MockedClass.Read(byte[] buffer, int offset, int count)

Пояснение:
Вызов Read загружает байт count чтение из offset в комплект поставки массива байтов buffer.

Теперь я хотел бы иметь буфер, заполненный после вызова Read был сделан в моем коде приложения. Это возможно?

Если да, то как я могу сделать последовательные звонки на Read? Я хотел бы, чтобы последовательные вызовы возвращали разные буферы каждый раз, когда это было возможно.

EDIT:

используя Setup команду:

MockedClass.Setup(x => x.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>()).Callback((byte[] buffer, int offset, int count) => buffer[0] = 0xAA);

дает мне странные проблемы при выполнении теста блока: После того, как вызов Read производится и код делегата (buffer[0] = 0xAA) выполнен, отладчик показывает, что buffer на самом деле null, и выполнение тестового блока останавливается после выполнения этой команды. Является ли мой синтаксис оборванным или это ошибка?

ответ

14

Вы можете использовать метод обратного вызова. Что-то вроде этого (из памяти):

var buffer = new byte[64]; 
// ... 
mock.Setup(m => m.Read(buffer, offset, count)) 
    .Callback((buffer, offset, count) => /* fill in buffer here */); 
+0

Hi Mark. Спасибо за ответ. Если я использую этот шаблон, мой модульный тест будет просто остановлен в тот момент в обратном вызове, когда делегат будет выполнен. Отладка проблемы показала, что массив байтовых буферов равен «null». Любые идеи, почему это может произойти? –

+0

Это значение равно null, если вы не назначили его. Вышеуказанный вызов Setup не * присваивает * буферную переменную - он соответствует существующей переменной. В вашем редактировании вы соответствуете 'It.IsAny ()', но вызывающий должен по-прежнему указывать значение. –

Смежные вопросы