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
将包含添加的值