1

そのクラスに依存するクラスをテストできるように、内部静的クラスにアクセスしてそのメソッドの一部をオーバーライドしようとしています

私が読んだことから、それは可能であるはずですが、単純な例でさえ内部静的クラスのモル型の生成に失敗しているように見えるため、明らかにすべてを理解しているわけではありません。

名前空間とアセンブリに 2 つのクラスがあります

namespace SimpleClassToTest
{
    public class Class1
    {
        public string SayOla() { return Class2.ReturnMe("Ola"); }
    }
}


namespace SimpleClassToTest
{
    internal static class Class2
    {
        static public string ReturnMe(string m)
        {
            return m;
        }
    }
}

AssemblyInfo.cs には、私も持っています

[assembly: InternalsVisibleTo("SimpleClassToTest")]
[assembly: InternalsVisibleTo("SimpleClassToTest.Moles")]

テストプロジェクトには、単一のテストクラスがあります

using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;

using SimpleClassToTest;
using SimpleClassToTest.Moles;

namespace SimpleClassToTest.Moles
{
    [TestClass]
    public class UnitTest1
    {
        public UnitTest1()
        {
        }

        [TestMethod]
        [HostType("Moles")]
        public void TestMethod1()
        {
            Class1 c1 = new Class1();
            Assert.AreEqual(c1.SayOla(), "Ola");
            MClass2.ReturnMeString = (ignored) => { return "ReturnMe"; };
            Assert.AreEqual(c1.SayOla(), "ReturnMe");
        }
    }
}

残念ながら、それはコンパイルされていません。エラーは

UnitTest1.cs(25,13): エラー CS0122: 保護レベルが原因で 'SimpleClassToTest.Moles.MClass2' にアクセスできません

これを実現するためのヒントがあれば、間違いなく高く評価されます。

ありがとう!

ピーター

PS VS2008 と VS2010 の両方で、ほくろバージョン Microsoft Moles v0.94.51023.0 でこれを試しました

(編集:以下のコメントから)

回避策として、単体テストで:

Type mClass2Type = typeof(SimpleClassToTest.Moles.MClass1)
                    .Assembly.GetType("SimpleClassToTest.Mole‌​s.MClass2"); 
PropertyInfo returnMeProp = mClass2Type.GetProperty("ReturnMeString");
Microsoft.Moles.Framework.MolesDelegates.Func<String, String> molesDelegate = 
      (ignore) => { return "ReturnMe"; };
returnMeProp.SetValue(mClass2Type, molesDelegate, null);
Assert.AreEqual(c1.SayOla(), "ReturnMe");
4

1 に答える 1

0

テスト対象のアセンブリが強力に署名されている場合、moles アセンブリも強力に署名されており、InternalsVisibleTo属性に公開キーを指定する必要があります。詳細については、moles リファレンス マニュアルの「コードの生成とコンパイル」のセクションを参照してください。

関連する可能性のある引用を次に示します。

... このスニペットを開始点として使用して、InternalsVisibleTo属性をプロジェクトに追加します。

[assembly: InternalsVisibleTo(“FileSystem.Moles, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e92decb949446f688ab9f6973436c535bf50acd1fd580495aae3f875aa4e4f663ca77908c63b7f0996977cb98fcfdb35e05aa2c842002703cad835473caac5ef14107e3a7fae01120a96558785f48319f66daabc862872b2c53f5ac11fa335c0165e202b4c011334c7bc8f4c4e570cf255190f4e3e2cbc9137ca57cb687947bc”)]

于 2012-06-28T15:45:43.993 に答える