Moq - 检查方法是否被模拟(设置)

时间:2017-06-09 16:50:12

标签: c# .net unit-testing moq

我们都知道在Moq中,我们可以使用Setup来模拟方法。如何检查方法是否正在设置?我不想调用该方法并检查其结果,因为这将在Verify期间计算为对模拟方法的实际调用(除非您可以告诉我如何使其不计数 - 这也将计为答案)。

2 个答案:

答案 0 :(得分:1)

实际上,我刚刚在ResetCalls上找到了Mock方法,它将重置计数器。这可能对我有所帮助,因为我可以调用父方法并将结果与​​预期结果进行比较。如果方法返回null,那么我设置因为它还没有完成,然后我通过调用ResetCalls来重置计数器(好像我从未检查过该方法的结果)。然后我继续进行子设置。

我需要注意它的副作用,但是如果其他人有同样的问题,请发布在这里。我仍然希望找到一个更好的答案,例如可能只将最后一次调用重置为模拟方法。我目前的发现重置了所有的呼叫,这可能不是我想要的所有情况。

答案 1 :(得分:0)

有一个非常脏的反射方法,但是它可以工作。

using System.Linq;
using System.Linq.Expressions;
using Moq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;

public static class MoqExtensions
{
    public static bool WasMethodSetup(this Mock mock, string method)
    {
        var moqSetups = new PrivateObject(new PrivateObject(mock).GetProperty("Setups")).Invoke("ToArray") as object[];
        var moqExpressions = moqSetups.Select(s => new PrivateObject(s).GetProperty("SetupExpression") as LambdaExpression);
        return moqExpressions.Where(e => e.Body.NodeType == ExpressionType.Call)
                .Select(b => new PrivateObject(new PrivateObject(b.Body).GetProperty("Method")).GetProperty("Name"))
                .Contains(method);
    }
}

用法示例

var mock = new Mock<IDisposable>();
mock.Setup(d => d.Dispose());
var b1 = mock.WasMethodSetup("Dispose"); // true
var b2 = mock.WasMethodSetup("666"); // false

当单元测试类对另一个子类进行子类化并且已经使用子类模拟程序设置了子类的测试时,存在一个问题。因此,解决此问题的唯一方法是设置子类模拟以回调您的模拟方法。 its.Ok(),但有时在您的回调工作流中,应将其重定向到原始的模拟方法回调。只是搜索如何从该模拟列表中调用它