更改NSubstitute中的参数值

时间:2015-06-26 13:02:39

标签: unit-testing 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.

如果方法隐式使用引用值,如何返回值?

2 个答案:

答案 0 :(得分: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;
    });

您显然可以删除for循环,因为您知道需要复制多少参数...

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;
    });

答案 1 :(得分: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; 
    });
相关问题