【问题标题】:How can I mock an out variable in c#?如何在 C# 中模拟 out 变量?
【发布时间】:2020-12-24 18:54:49
【问题描述】:

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

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

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

我之前尝试过,但失败了。帮帮我

【问题讨论】:

标签: c# unit-testing moq


【解决方案1】:

设置具有适当签名的委托:

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;

您可以通过herehere了解更多信息

【讨论】:

  • 我还没有足够的声誉来评论下面杰米的回答,所以我将在这里发布我的回复:杰米:请注意,您的解决方案可能存在严重的限制。它只允许 out 参数返回它们在调用 mock.Setup() 语句时分配的值。在您的情况下,这意味着 result 将始终返回 {..Whatever data you have},err 将始终返回 State 的默认值,而 errorMessage 将始终返回 string 的默认值。根据您的测试场景,这可能就足够并且可以接受。在其他情况下 - 没有。
【解决方案2】:

这是我最小起订量参数的方式:

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

【讨论】:

    【解决方案3】:

    我发现我的答案比使用回调/委托要好得多。

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

    【讨论】:

      猜你喜欢
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      相关资源
      最近更新 更多