そのクラスに依存するクラスをテストできるように、内部静的クラスにアクセスしてそのメソッドの一部をオーバーライドしようとしています
私が読んだことから、それは可能であるはずですが、単純な例でさえ内部静的クラスのモル型の生成に失敗しているように見えるため、明らかにすべてを理解しているわけではありません。
名前空間とアセンブリに 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.Moles.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");