Moq示例:如何使用out和ref

9

我正在尝试对一些实现输出参数的遗留方法进行测试。 你能给我一个如何做到这一点的例子吗?


2
你需要澄清你在做什么,以及为什么结果与预期不符。仅仅说“使用Moq无参数”是不够的——首先,你为什么需要使用Moq?请展示一些代码。 - Tomas Aschan
好的,环境比较复杂,我得自己编写一些代码。我只是想知道是否有完整的代码片段可以参考。这就是全部。我会编写一些代码并发布它。 - user9969
3个回答

24

直接将测试中的outref参数分配给它们。

假设有以下接口:

public interface ILegacy
{
    bool Foo(out string bar);
}
你可以这样编写一个测试:

你可以这样编写一个测试:

[TestMethod]
public void Test13()
{
    string bar = "ploeh";

    var legacyStub = new Mock<ILegacy>();
    legacyStub.Setup(l => l.Foo(out bar))
        .Returns(true);

    Assert.IsTrue(legacyStub.Object.Foo(out bar));
    Assert.AreEqual("ploeh", bar);
}

太棒了。这就是我需要的。只要有点东西让我开始就行了。不过有一件事,你没有使用 "It.IsAny" 的东西。例如 (Foo(out it.IsAny<Bar>));我以为那是必须的。你能澄清一下吗?我会很感激的。谢谢。 - user9969
快速入门中有很多It.Is*,我建议定期阅读它们,因为你不可能在一次阅读中全部消化它们(如果你需要在单个测试套件中使用所有内容,那么你做错了什么!) - Ruben Bartelink
1
@devnet247:这个不值得你点一个+1 吗?这样做有点不尊重Mark的时间。(有人给了这个问题一个+1,我猜是Mark,我给它一个-1来抵消因为没有做任何作业)。点一个+1支持这个答案。 - Ruben Bartelink
嗨,Ruben。我标记了2,这似乎是我被允许做的最大值。我还没有看过1号标志。 - user9969
这段代码真的需要更清晰地解释ref和out之间的区别,因为它们在Moq中是完全不同的。虽然问题针对的是out,但我不希望有人将ref误解为相同的含义。 - Morgeth888

2

我同意。我道歉。对于这个问题,我真的不知道从哪里开始,因为实际的“真正代码”有点复杂,无法贴出。我应该自己构建一个简单的示例。吸取了教训。 - user9969

1

顺便提一下,如果你想使用moq(目前)来模拟输出参数,你还需要进行以下跳跃。假设你想模拟一个返回另一个模拟对象的输出参数,例如。

var mockServiceA = new Mock<IMyService>();
var mockServiceOutput = new Mock<IMyServiceOutput>();

// This will not work...
mockServiceA.Setup(svc => svc.DoSomething(out mockServiceOutput.Object));

// To have this work you have to do the following
IMyServiceOutput castOutput = mockServiceOutput.Object;
mockServiceA.Setup(svc => svc.DoSomething(out castOutput));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接