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を含む)と、それらを簡単に削除する方法を見てきました。それらの多くには、次のようなラムダのある行があります。

MMyClass.AllInstances.DoSomething = () => "Hello world";
Assert.AreEqual("Hello world", new MyClass().DoSomething());

基本的な問題は、Molesがパラメーターを受け取らず、文字列を返すメソッドから開始したことです。Moledに相当するものは、独自のクラスをパラメーターとして受け取り、文字列を返します。確かに、MolesはTestString()がOrigValueのメンバーであることを知っています。

たぶん私の問題は、有料版ではなく、VSExpressを使用した結果です。私はそれと一緒に暮らすことができますが、それでも私がハックを必要とする理由を知ることは興味深いでしょう。私の知らないうちに、ハッキングによって誤ったテスト結果が生成される場合があります。

ところで:この例は、オブジェクトブラウザの価値を証明していると思います。

4

1 に答える 1

0

あなたの期待は間違っています。あなたが説明する「ハック」は、AllInstancesネストされた型を使用する公式に文書化された方法です。そのデリゲートは実際には、テスト対象の型のインスタンスを含むパラメーターを常に受け​​取ります。

のこの形式の使用法を見た可能性は低いです。AllInstances

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

ある場合は、コードの作成者が犯した間違いである可能性があります。

型に属するデリゲートの定義であると期待されるのは、AllInstances実際には別の種類の Moles の使用法です。単一インスタンスのインスタンス メソッドを迂回するために使用されます。

ドキュメント「Microsoft Moles Reference Manual」の「Mole Basics」セクションには、このトピックに関する詳細情報が含まれています。そこからの抜粋です。

インスタンス メソッド (1 つのインスタンスの場合)

... これらのほくろを設定するプロパティは、ほくろ型自体のインスタンス メソッドです。インスタンス化された各モル型は、moled メソッド型の生のインスタンスにも関連付けられています。

たとえばMyClass、インスタンス メソッドを持つクラスがあるとしMyMethodます。

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

MyMethod最初のモル型が常に 5 を返し、2 番目のモル型が常に 10 を返すように、2 つのモル型を設定できます。

var myClass1 = new MMyClass() { MyMethod = () => 5 };
var myClass2 = new MMyClass() { MyMethod = () => 10 };
于 2012-04-07T04:59:48.120 に答える