如何使用 Fakes 模拟带有委托的泛型方法
How to mock a generic method with delegate in it using Fakes
我有如下方法,我想使用 Fakes 进行模拟。在这方面的任何帮助真的很感激吗?
IEnumerable<T> ExecuteReader<T>(
string commandText,
Func<IDataRecord, T> returnFunc,
int timeOut = 30);
假设您已经为有问题的 interface/class 生成了假程序集,那么这取决于您是使用接口(或虚拟方法)来定义方法还是仅使用 class。如果是接口或虚方法,你可以使用像
这样的存根
[TestMethod]
public void StubFuncTest()
{
StubITestReader stubClass = new StubITestReader();
stubClass.ExecuteReaderOf1StringFuncOfIDataRecordM0Int32<int>((str, func, timeout) =>
{
int[] retVal = {12, 25, 15};
return retVal;
});
ITestReader reader = stubClass;
IEnumerable<int> curInt = reader.ExecuteReader<int>("testText", TestFunc);
foreach (var i in curInt)
{
Console.WriteLine(i);
}
}
或者如果只是标准方法,您需要使用垫片(我建议使用第一个选项)
[TestMethod]
public void ShimFuncTest()
{
TestUnitTestClass tutClass = new TestUnitTestClass();
using (ShimsContext.Create())
{
ShimTestUnitTestClass shimClass = new ShimTestUnitTestClass(tutClass);
shimClass.ExecuteReaderOf1StringFuncOfIDataRecordM0Int32<int>((str, func, timeout) =>
{
int[] retVal = {12, 25, 15};
return retVal;
});
IEnumerable<int> curInt = tutClass.ExecuteReader<int>("testText", TestFunc);
foreach (var i in curInt)
{
Console.WriteLine(i);
}
}
}
添加对评论的回复
对于普通方法来说要容易一些。使用存根,它会像
[TestMethod]
public void StubRegFuncTest()
{
StubITestReader stubClass = new StubITestReader();
stubClass.ExecuteNonQueryStringInt32 = (str, timeout) => timeout * 2;
ITestReader reader = stubClass;
int curInt = reader.ExecuteNonQuery("testText");
Console.WriteLine(curInt);
curInt = reader.ExecuteNonQuery("testText", 10);
Console.WriteLine(curInt);
}
不太明显的区别是泛型方法用括号括起来,而普通方法只是 lambda 表达式和代码块。
我有如下方法,我想使用 Fakes 进行模拟。在这方面的任何帮助真的很感激吗?
IEnumerable<T> ExecuteReader<T>(
string commandText,
Func<IDataRecord, T> returnFunc,
int timeOut = 30);
假设您已经为有问题的 interface/class 生成了假程序集,那么这取决于您是使用接口(或虚拟方法)来定义方法还是仅使用 class。如果是接口或虚方法,你可以使用像
这样的存根 [TestMethod]
public void StubFuncTest()
{
StubITestReader stubClass = new StubITestReader();
stubClass.ExecuteReaderOf1StringFuncOfIDataRecordM0Int32<int>((str, func, timeout) =>
{
int[] retVal = {12, 25, 15};
return retVal;
});
ITestReader reader = stubClass;
IEnumerable<int> curInt = reader.ExecuteReader<int>("testText", TestFunc);
foreach (var i in curInt)
{
Console.WriteLine(i);
}
}
或者如果只是标准方法,您需要使用垫片(我建议使用第一个选项)
[TestMethod]
public void ShimFuncTest()
{
TestUnitTestClass tutClass = new TestUnitTestClass();
using (ShimsContext.Create())
{
ShimTestUnitTestClass shimClass = new ShimTestUnitTestClass(tutClass);
shimClass.ExecuteReaderOf1StringFuncOfIDataRecordM0Int32<int>((str, func, timeout) =>
{
int[] retVal = {12, 25, 15};
return retVal;
});
IEnumerable<int> curInt = tutClass.ExecuteReader<int>("testText", TestFunc);
foreach (var i in curInt)
{
Console.WriteLine(i);
}
}
}
添加对评论的回复
对于普通方法来说要容易一些。使用存根,它会像
[TestMethod]
public void StubRegFuncTest()
{
StubITestReader stubClass = new StubITestReader();
stubClass.ExecuteNonQueryStringInt32 = (str, timeout) => timeout * 2;
ITestReader reader = stubClass;
int curInt = reader.ExecuteNonQuery("testText");
Console.WriteLine(curInt);
curInt = reader.ExecuteNonQuery("testText", 10);
Console.WriteLine(curInt);
}
不太明显的区别是泛型方法用括号括起来,而普通方法只是 lambda 表达式和代码块。