如何在 C# 中模拟 out 变量?

How can I mock an out variable in c#?

我正在使用 Moq 框架。我正在尝试从函数调用中模拟数据,但问题是,函数 RETURNS 是一个布尔值,响应数据来自 BsonArray 形式的 OUT 变量。我如何模拟这个 out 变量?

database.runQuery(query, out BsonArray result, out err, out errorMessage);

我们如何设置此函数以供模拟使用? 例如mock.Setup(x => x.runQuery(It.IsAnyblahblah)

我以前尝试过但失败了。帮帮我

设置具有适当签名的代理人:

public delegate void OutAction<T1, T2, T3, T4>(T1 arg1, out T2 arg2, out T3 arg3, out T4 arg4);

声明变量以接受您的 out 值(其中 P1P3P4 是这些变量的类型):

var test_result = new BsonArray(); // I'm not familiar with this class, so this is just a guess
var test_err = new P3();
var test_errorMessage = new P4();

然后创建你的模拟

mock
  .Setup(x => x.runQuery(It.IsAny<P1>(), out It.IsAny<BsonArray>(), out It.IsAny<P3>(), out It.IsAny<P4>()))
  .Callback(new OutAction<P1,BsonArray,P3,P4>((P1 var1, out BsonArray var2, out P3 var3, out P4 var4) => { _code_to_set_the_values_of_var2_var3_and_var4; }))
  .Returns _desired_return_value_for_runQuery;

你可以了解更多here or here

这是我最小化参数的方式:

delegate void SubmitTest(out string  mystring );

string sentSql = string.Empty;
string  functionResult = string.Empty;;
Mock.setup(x=>x.runQuery(out It.ref<string>().IsAny))
.Callback( new SubmitTest( (out string  mystring) => 
{
   sentSql = mystring;  // see what was sent
   functionresult  = somefunctionCall(mySql) ; if  i was calling  function
}
.Returns( 
   // can use  "select * From customer";
   // or sentSql
);

我找到答案的方式比 callbacks/delegates 好得多。

bsonArray result = {..Whatever data you have};
State err = default;
string errorMessage = default;
mock.Setup(x => x.runQuery(It.IsAny<string>(), out result, out err, out errorMessage);