我的通用类采用Func< T>构造函数中的参数,我想测试一个基本上调用构造函数参数的方法 我使用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来模拟接口。但它似乎没有效果。
我错过了什么吗?任何想法将不胜感激。
谢谢,
安东
答案 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);