我正在尝试调试以下行:
MOrigValue.AllInstances.TestString = () => "New value";
下面有一条红色的波浪线:
() => "New value";
Mouseover显示以下错误:
Delegate 'Microsoft.Moles.Framework.MolesDelegates.Func<OrigValueP.OrigValue, string>' does not take 0 arguments
这是完整的课程:
namespace OrigValueP
{
public class OrigValue
{
public string TestString() { return "Original value"; }
}
}
以下是对象浏览器中的信息。
单击属性MOrigValue.AllInstances.TestString:
public static Microsoft.Moles.Framework.MolesDelegates.Func<OrigValueP.OrigValue,string> TestString { set; }
Member of OrigValueP.Moles.MOrigValue.AllInstances
所以,对于像我这样的非技术人员来说,这可以解释上面的红色波浪线错误。
单击属性MOrigValue..TestString:
public Microsoft.Moles.Framework.MolesDelegates.Func<string> TestString { set; }
Member of OrigValueP.Moles.MOrigValue
对我来说,这看起来像我希望看到MOrigValue.AllInstances.TestString的定义。换句话说,一个实际上是Moled“方法”的属性,它没有参数并返回一个字符串。
作为一项实验,根据上面的第一个对象浏览器信息,我将该类作为输入参数插入,如下所示:
MOrigValue.AllInstances.TestString = (OrigValue) => "New value";
这有效:)
但我的解决方法看起来像是“黑客”。我已经看到互联网上的每个页面(包括StackOverflow)都与痣有关,以及如何轻松地删除它们。他们中的许多人都拥有类似于以下内容的lambda:
MMyClass.AllInstances.DoSomething = () => "Hello world";
Assert.AreEqual("Hello world", new MyClass().DoSomething());
基本问题是Moles从一个不带参数的方法开始并返回一个字符串。 Moled等效项将其自己的类作为参数并返回一个字符串。当然,Moles知道TestString()是OrigValue的成员。
也许我的问题是使用VS Express而不是付费版本的结果。我可以忍受这一点,但知道我为什么需要黑客仍然会很有趣。可能存在黑客在我不知情的情况下产生不正确的测试结果的情况。
BTW:我认为这个例子证明了对象浏览器的价值。
答案 0 :(得分:0)
你的期望是错误的。您描述的“hack”是使用AllInstances
嵌套类型的官方文档记录方式。它的委托实际上总是使用包含被测类型实例的参数。
您不太可能看到AllInstances
MMyClass.AllInstances.DoSomething = () => "Hello world";
如果你有,可能是代码作者犯的错误。
您期望属于AllInstances
类型的委托的定义实际上是对Moles的另一种使用:它用于绕过单个实例的实例方法。
“Microsoft Moles参考手册”文档的“Mole Basics”部分包含有关该主题的更多信息。这是摘录。
...设置这些痣的属性是鼹鼠类型本身的实例方法。每个实例化的mole类型也与moled方法类型的原始实例相关联。
例如,给定一个具有实例方法MyClass
的类MyMethod
:
public class MyClass {
public int MyMethod() {
...
}
}
我们可以设置两种鼹鼠类型的MyMethod
,这样第一个总是返回5而第二个总是返回10:
var myClass1 = new MMyClass() { MyMethod = () => 5 };
var myClass2 = new MMyClass() { MyMethod = () => 10 };