2015-06-26 9 views
0

У меня этот метод высмеивать с NSubstitute:изменения значения параметра в NSubstitute

public T VoerStoredProcedureUit<T>(string naam, params SqlParameter[] parameters) 

Метод испытания с использованием он посылает 2 SqlParameters этого метода. Предполагается, что VoerStoredProcedureUit изменит значения этих параметров, чтобы тестируемый метод смог извлечь их.

Я создал следующий с NSubstitute:

SqlParameter[] param = 
    { 
     new SqlParameter("@pat_id", SqlDbType.BigInt) {Direction = ParameterDirection.Output, Value = "Melding"}, 
     new SqlParameter("@Melding", SqlDbType.VarChar, 4096) {Direction = ParameterDirection.Output, Value = 2} 
    }; 
    productieVerbinding.VoerStoredProcedureUit<PatientNieuwResultaat>(Arg.Any<string>(), 
     Arg.Any<SqlParameter[]>()).ReturnsForAnyArgs(x => 
     { 
      x[1] = param; 
      return PatientNieuwResultaat.Succes; 
     }); 

Установка однако поднимается исключением:

A first chance exception of type 'NSubstitute.Exceptions.ArgumentIsNotOutOrRefException' occurred in NSubstitute.dll 

Additional information: Could not set argument 1 (SqlParameter[]) as it is not an out or ref argument. 

Как вы вернуть значение, если метод использует неявно эталонные значения?

ответ

0

я нашел рабочий раствор. Присвоение новой переменной параметрам не помогло, но их изменение. Кроме того, вторым параметром метода является массив, поэтому его следует рассматривать как таковой.

productieVerbinding.VoerStoredProcedureUit<PatientNieuwResultaat>(Arg.Any<string>(), 
    Arg.Any<SqlParameter[]>()).ReturnsForAnyArgs(x => 
    { 
     paramPatId = ((SqlParameter[])x[1])[0]; 
     paramMelding = ((SqlParameter[])x[1])[1]; 

     paramPatId.Value = (long)2; 
     paramMelding.Value = "Melding"; 

     return PatientNieuwResultaat.Succes; 
    }); 
0

Если я правильно понял ваш вопрос, вы пытаетесь вернуть содержимое param, когда вызывается VoerStoredProcedureUit<PatientNieuwResultaat>.

В ReturnsForAnyArgs, x[1] относится ко второму параметру, который является SqlParameter[]. Это не параметр ref/out, поэтому вы не можете переназначить его в вызывающем, поэтому вы получаете сообщение об ошибке. Вместо этого вам нужно скопировать элементы из вашего шаблона в поставляемый массив. Что-то вроде этого:

productieVerbinding.VoerStoredProcedureUit<PatientNieuwResultaat>(Arg.Any<string>(), 
    Arg.Any<SqlParameter[]>()).ReturnsForAnyArgs((x) => 
    { 
     for (int i = 0; i < param.Length; i++) 
     { 
      ((SqlParameter[])x[1])[i] = param[i]; 
     } 
     return PatientNieuwResultaat.Succes; 
    }); 

Вы могли бы, очевидно, удалить цикл, так как вы знаете, сколько параметров необходимо скопировать ...

productieVerbinding.VoerStoredProcedureUit<PatientNieuwResultaat>(Arg.Any<string>(), 
    Arg.Any<SqlParameter[]>()).ReturnsForAnyArgs((x) => 
    { 
     ((SqlParameter[])x[1])[0] = param[0]; 
     ((SqlParameter[])x[1])[1] = param[1]; 
     return PatientNieuwResultaat.Succes; 
    }); 
+0

Как-то назначение элементов в массиве непосредственно новым переменным не сработало, но оно поставило меня в правильное направление. Спасибо за это, forsvarir. –