如何验证我的Func <t>在测试方法中被调用</t>

时间:2011-01-14 17:07:35

标签: c# moq

我的通用类采用Func&lt; T&gt;构造函数中的参数,我想测试一个基本上调用构造函数参数的方法 我使用Moq,在我的测试代码中是这样的:

[Fact]
public void Construct_EnsureInvokeFunction()
{
    _objectToTest=new TypeToTest<T>(It.IsAny<Func<T>>());
    _objectToTest.Construct();
    //here I want to ensure that the passed parameter is invoked
    //however since I can't mock Func<T>, I dont know how to verify 
    //whether Invoke method of Func<T> is triggered
}

我能想到的一个解决方法是包装我的Func&lt; T&gt;在一个新的接口内部并创建一个方法来包装它的Invoke方法,然后使用Moq来模拟接口。但它似乎没有效果。

我错过了什么吗?任何想法将不胜感激。

谢谢,

安东

2 个答案:

答案 0 :(得分:2)

您可以使用副作用创建一个简单的假Func<T>闭包,并验证这些副作用。一个好的方法是递增一个局部变量,因为它还允许你断言它的调用次数不应该超过它应该。像这样:

int counter = 0;
Func<T> f = () => { counter++; return fakeT; }
var objectToTest = new TypeToTest<T>(f);
objectToTest.Construct();
Assert.Equal(1, counter);

答案 1 :(得分:2)

您可以将Func<T>包装在一个设置局部变量的匿名方法中:

bool wasInvoked = false;
Func<T> testFunc = () => { var ret = funcToTest(); wasInvoked = true; return ret; }

// Test something with testFunc instead of funcToTest
...

Assert.IsTrue(wasInvoked);