首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSubstitute中参数值的变化

NSubstitute中参数值的变化
EN

Stack Overflow用户
提问于 2015-06-26 13:02:39
回答 2查看 1.6K关注 0票数 1

我有一个可以用NSubstitute模拟的方法:

代码语言:javascript
复制
public T VoerStoredProcedureUit<T>(string naam, params SqlParameter[] parameters)

使用它的测试方法向该方法发送2 SqlParameters。VoerStoredProcedureUit应该改变这些参数的值,这样被测试的方法就可以提取这些参数。

我用NSubstitute创建了以下内容:

代码语言:javascript
复制
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; 
        });

但是,设置会引发异常:

代码语言:javascript
复制
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.

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-29 10:28:53

我找到了一个可行的解决方案。将一个新变量分配给参数是不可行的,但是更改它们是有效的。此外,方法参数的第二个是数组,因此应该将其视为数组。

代码语言:javascript
复制
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; 
    });
票数 1
EN

Stack Overflow用户

发布于 2015-06-26 17:01:22

如果我正确理解了您的问题,那么在调用param时,您将试图返回VoerStoredProcedureUit<PatientNieuwResultaat>的内容。

ReturnsForAnyArgs中,x[1]引用第二个参数,即SqlParameter[]。这不是ref/out参数,所以您不能在调用者中重新分配它,这就是为什么您会得到一个错误。相反,您需要将元素从模板复制到提供的数组中。就像这样:

代码语言:javascript
复制
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循环,因为您知道需要复制多少参数.

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31073900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档