【问题标题】:Why do I get a lambda error that no-one else gets?为什么我会得到一个其他人没有得到的 lambda 错误?
【发布时间】:2012-04-06 08:44:26
【问题描述】:

我正在尝试调试以下行:

MOrigValue.AllInstances.TestString = () => "New value";

下面有一条红色波浪线:

() => "New value";

鼠标悬停显示以下错误:

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 而不是付费版本的结果。我可以忍受这一点,但知道我为什么需要黑客仍然很有趣。在我不知情的情况下,黑客可能会产生不正确的测试结果。

顺便说一句:我认为这个例子证明了对象浏览器的价值。

【问题讨论】:

    标签: moles


    【解决方案1】:

    你的期望是错误的。您描述的“hack”是使用 AllInstances 嵌套类型的官方记录方式。它的委托确实总是接受一个包含被测类型实例的参数。

    您不太可能看到AllInstances 的这种用法

    MMyClass.AllInstances.DoSomething = () => "Hello world";
    

    如果有的话,这可能是代码作者犯的错误。

    您所期望的属于AllInstances 类型的委托的定义实际上是 Moles 的另一种用法:它用于绕过单个实例的实例方法。

    “Microsoft Moles 参考手册”文档的“Mole 基础知识”部分包含有关该主题的更多信息。这是那里的摘录。

    实例方法(一个实例)

    ... 设置这些痣的属性是痣类型本身的实例方法。每个实例化的摩尔类型也与一个摩尔方法类型的原始实例相关联。

    例如,给定一个类MyClass,其实例方法为MyMethod

    public class MyClass {
        public int MyMethod() {
            ...
        }
    }
    

    我们可以设置两种摩尔类型的MyMethod,这样第一个总是返回5,第二个总是返回10:

    var myClass1 = new MMyClass() { MyMethod = () => 5 };
    var myClass2 = new MMyClass() { MyMethod = () => 10 };
    

    【讨论】:

      猜你喜欢
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 2016-11-25
      相关资源
      最近更新 更多