我遇到的问题是我无法模拟具有ref参数的方法。 我想嘲笑的方法的签名如下:
class ContractRepository
...
public long GetValueAndIncrement(ref Counter counter)
{
...
}
我试着像这样嘲笑:
Random myRandomizer = new Random();
var contractRepo = new SIContractRepository();
contractRepo.GetValueAndIncrementCounterRef = ((internalCounter) => Int64.Parse(myRandomizer.Next().ToString()));
但编译器告诉我,我错过了“ref”关键字,但当我尝试这样的时候
Random myRandomizer = new Random();
var contractRepo = new SIContractRepository();
contractRepo.GetValueAndIncrementCounterRef = ((ref internalCounter) => Int64.Parse(myRandomizer.Next().ToString()));
我收到一条错误,指出ref是无效的表达式
不幸的是,谷歌在这里没有帮助。 :( 有什么想法吗?
答案 0 :(得分:1)
在这种情况下,您根本无法使用匿名方法,因为它们既不支持ref也不支持out参数。您需要创建一个“真正的”方法。
public void SetupMock()
{
Random myRandomizer = new Random();
var contractRepo = new SIContractRepository();
contractRepo.GetValueAndIncrementCounterRef = GetValueAndIncrementMock;
}
public long GetValueAndIncrementMock(ref Counter counter)
{
return Int64.Parse(myRandomizer.Next().ToString())
}
答案 1 :(得分:1)
你可以使用 ref 关键字的匿名方法,只需在匿名方法中明确指定类型:
(ref Counter internalCounter) => Int64.Parse(myRandomizer.Next().ToString())
答案 2 :(得分:1)
请记住,当前版本的Moles仅支持ref和out参数作为方法的LAST参数。
http://research.microsoft.com/en-us/projects/pex/molesmanual.pdf
限制 目前Moles的实施有几个局限性。这些限制不是 该方法固有的,可能在未来的Moles版本中得到解决: Moles框架仅支持有限数量的方法签名 10个参数,最后一个参数可以是out或ref参数。 不支持带指针的方法签名。 由于存根类型依赖,因此无法对存根类或静态方法进行存根 虚方法调度。对于这种情况,使用“鼹鼠”中描述的痣类型 类型“在本文档的后面
答案 3 :(得分:0)
我不确定这是否是应用痣的正确方法,但我做到了。它有效。
///method get call in unit test
public static void DetermineSprintCorporateLiableCustomer()
{
COptions p2 = new COptions();
MGetCOptions.CustomerInfoCallerOptionsRef = (ref COptions p1) =>
{
if (p1 != null && p1 != null && p1.Type.Equals(
"Data", StringComparison.OrdinalIgnoreCase))
{
p1.Type = "P";
p1.Indicator = true;
}
p2 = p1;
};
}
在测试运行期间执行此部件时,可以使用新的p2。以下是我的情景。
// need to unit test Coptions.Type="Data"
public static MainMethod(Coptions)
{
Mclass.Method(ref Coptions);
If(COptions.Type="B")
Do something();
}
它适用于新的价值,但可能有更好的方法。