为什么我得到一个没有其他人得到的lambda错误?

时间:2012-04-06 08:44:26

标签: moles

我正在尝试调试以下行:

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:我认为这个例子证明了对象浏览器的价值。

1 个答案:

答案 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 };