我正在尝试访问内部静态类以覆盖其某些方法,以便我可以测试依赖于该类的类
从我读到的应该是可能的,但我显然不是理解一切,因为即使是一个简单的例子似乎也无法为内部静态类生成一个痣类型。
我在命名空间和程序集中有两个类
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 上都试过这个,带有 moles 版本 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");