使用Moq通过引用传递的数组验证方法

时间:2010-04-12 10:41:42

标签: moq pass-by-reference

给出以下界面

public interface ISomething {
  void DoMany(string[] strs);
  void DoManyRef(ref string[] strs);
}

我想验证是否调用了DoManyRef方法,并将任何字符串数组作为strs参数传递。以下测试失败:

public void CanVerifyMethodsWithArrayRefParameter() {
  var a = new Mock<ISomething>().Object;
  var strs = new string[0];
  a.DoManyRef(ref strs);
  var other = It.IsAny<string[]>();
  Mock.Get(a).Verify(t => t.DoManyRef(ref other));
}

虽然以下不需要通过引用传递的数组:

public void CanVerifyMethodsWithArrayParameter() {
  var a = new Mock<ISomething>().Object;
  a.DoMany(new[] { "a", "b" });
  Mock.Get(a).Verify(t => t.DoMany(It.IsAny<string[]>()));
}

我无法更改界面以消除参考要求。

1 个答案:

答案 0 :(得分:1)

要验证ref参数,您需要将实际实例传递给verify调用。这意味着您的第一次测试应如下所示:

[Test]
public void CanVerifyMethodsWithArrayRefParameter()
{
    var a = new Mock<ISomething>().Object;
    var strs = new string[0];
    a.DoManyRef(ref strs);
    Mock.Get(a).Verify(t => t.DoManyRef(ref strs));
}

问题的最后一句使我相信您可能无法进行更改,但这是验证调用成功所需的内容。希望这会有所帮助。