Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Moq回调不修改输入参数_C#_Unit Testing_Ado.net_Moq - Fatal编程技术网

C# Moq回调不修改输入参数

C# Moq回调不修改输入参数,c#,unit-testing,ado.net,moq,C#,Unit Testing,Ado.net,Moq,问题: public interface IGenericDAO { int ExecuteStoredProcedureWithParameters(string procedureName, Collection<SqlParameter> parameters); } // Create a mock generic DAO var mock = new Mock<IGenericDAO>(); mock.Setup(x => x.ExecuteSt

问题:

public interface IGenericDAO
{
    int ExecuteStoredProcedureWithParameters(string procedureName, Collection<SqlParameter> parameters);
}
// Create a mock generic DAO
var mock = new Mock<IGenericDAO>();
mock.Setup(x => x.ExecuteStoredProcedureWithParameters("TestProcedure", It.IsAny<Collection<SqlParameter>>()))
    .Returns(111)
    .Callback<string, Collection<SqlParameter>>((proc, prms) => { proc = string.Empty; prms = null; });

// Execute the mocked method with dummy parameters
var testProcedure = "TestProcedure";
var testParameters = new Collection<SqlParameter>();
var retval = mock.Object.ExecuteStoredProcedureWithParameters(testProcedure, testParameters);
下面的代码不允许我修改传递给已被Moq模拟的方法的参数

其他详细信息:

public interface IGenericDAO
{
    int ExecuteStoredProcedureWithParameters(string procedureName, Collection<SqlParameter> parameters);
}
// Create a mock generic DAO
var mock = new Mock<IGenericDAO>();
mock.Setup(x => x.ExecuteStoredProcedureWithParameters("TestProcedure", It.IsAny<Collection<SqlParameter>>()))
    .Returns(111)
    .Callback<string, Collection<SqlParameter>>((proc, prms) => { proc = string.Empty; prms = null; });

// Execute the mocked method with dummy parameters
var testProcedure = "TestProcedure";
var testParameters = new Collection<SqlParameter>();
var retval = mock.Object.ExecuteStoredProcedureWithParameters(testProcedure, testParameters);
我试图模拟一个通用数据访问对象,该对象提供一个名为
ExecuteStoredProcedureWithParameters
的方法。该方法接受两个参数:存储过程名称和
SqlParameter
对象的集合。我有通过输出参数返回值的存储过程,因此我尝试模拟数据访问方法并修改输出参数的值(它是传入的
SqlParameter
集合的成员)。根据我的研究,我下面的代码似乎应该可以工作(为了测试目的,我只是试图通过将输入参数设置为空/空来修改它们)。我在模拟设置中指定的返回值返回并存储在
retval
中,但是执行模拟方法后,
testProcedure
testParameters
的值保持不变。我做错了什么?如何修改传递到mock方法中的对象

我的界面:

public interface IGenericDAO
{
    int ExecuteStoredProcedureWithParameters(string procedureName, Collection<SqlParameter> parameters);
}
// Create a mock generic DAO
var mock = new Mock<IGenericDAO>();
mock.Setup(x => x.ExecuteStoredProcedureWithParameters("TestProcedure", It.IsAny<Collection<SqlParameter>>()))
    .Returns(111)
    .Callback<string, Collection<SqlParameter>>((proc, prms) => { proc = string.Empty; prms = null; });

// Execute the mocked method with dummy parameters
var testProcedure = "TestProcedure";
var testParameters = new Collection<SqlParameter>();
var retval = mock.Object.ExecuteStoredProcedureWithParameters(testProcedure, testParameters);
公共接口IGenericDAO
{
int ExecuteStoreProcedureWithParameters(字符串procedureName,集合参数);
}
试验方法:

public interface IGenericDAO
{
    int ExecuteStoredProcedureWithParameters(string procedureName, Collection<SqlParameter> parameters);
}
// Create a mock generic DAO
var mock = new Mock<IGenericDAO>();
mock.Setup(x => x.ExecuteStoredProcedureWithParameters("TestProcedure", It.IsAny<Collection<SqlParameter>>()))
    .Returns(111)
    .Callback<string, Collection<SqlParameter>>((proc, prms) => { proc = string.Empty; prms = null; });

// Execute the mocked method with dummy parameters
var testProcedure = "TestProcedure";
var testParameters = new Collection<SqlParameter>();
var retval = mock.Object.ExecuteStoredProcedureWithParameters(testProcedure, testParameters);
//创建一个模拟泛型DAO
var mock=new mock();
mock.Setup(x=>x.ExecuteStoredProcedureWithParameters(“TestProcedure”,It.IsAny()))
.申报表(111)
.Callback((proc,prms)=>{proc=string.Empty;prms=null;});
//使用虚拟参数执行模拟方法
var testProcedure=“testProcedure”;
var testParameters=new Collection();
var retval=mock.Object.ExecuteStoreProcedureWithParameters(testProcedure,testParameters);

您正在将局部变量
prms
设置为null。这对实际的
testParameters
变量没有影响,因为标准的传递值语义。
集合
通过值传递到函数中,因此与任何其他变量一样进行浅层复制。您所做的与这个简单的示例类似:

void A()
{
    int x = 10;
    B(x);
    Console.WriteLine(x); // 'x' is still 10
}

void B(int x) // input argument copied into local 'x'
{
    x = 20;   // local 'x' modified
}             // local 'x' discarded
这将打印出10,因为只有本地副本
x
被修改,然后在函数结束时丢弃

在实际示例中,如果执行类似于
prms.Add(newsqlparameter(…)
的操作,那么在调用结束时,
testParameters
将包含添加的值