0

我正在尝试调试以下行:

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

BTW:我认为这个例子证明了对象浏览器的价值。

4

1 回答 1

0

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

您不太可能看到这种形式的使用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 };
于 2012-04-07T04:59:48.120 回答