【问题标题】:Generated moles type for a static internal class is not accessible in test class在测试类中无法访问静态内部类的生成的痣类型
【发布时间】:2012-06-28 12:06:00
【问题描述】:

我正在尝试访问一个内部静态类以覆盖它的一些方法,以便我可以测试依赖于该类的类

从我读到的内容来看,这应该是可能的,但我显然不是不理解所有内容,因为即使是一个简单的例子似乎也无法为内部静态类生成一个痣类型。

我在命名空间和程序集中有两个类

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.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");

【问题讨论】:

  • 作为一种变通方法,在单元测试中Type mClass2Type = typeof(SimpleClassToTest.Moles.MClass1).Assembly.GetType("SimpleClassToTest.Moles.MClass2"); PropertyInfo returnMeProp = mClass2Type.GetProperty("ReturnMeString"); Microsoft.Moles.Framework.MolesDelegates.Func&lt;String, String&gt; molesDelegate = (ignore) =&gt; { return "ReturnMe"; }; returnMeProp.SetValue(mClass2Type, molesDelegate, null); Assert.AreEqual(c1.SayOla(), "ReturnMe"); }

标签: moles


【解决方案1】:

如果您的被测程序集是强签名的,则 moles 程序集也是强签名的,您必须在 InternalsVisibleTo 属性中指定公钥。有关详细信息,请参阅 moles 参考手册的“代码生成和编译”部分。

这是一个可能相关的引述:

... 使用这个 sn-p 作为 将 InternalsVisibleTo 属性添加到您的项目的起点。

[组件:InternalsVisibleTo(“FileSystem.Moles,公钥= 0024000004800000940000000602000000240000525341310004000001000100e92decb949446f688ab9f6973436c535bf50acd1fd580495aae3f875aa4e4f663ca77908c63b7f0996977cb98fcfdb35e05aa2c842002703cad835473caac5ef14107e3a7fae01120a96558785f48319f66daabc862872b2c53f5ac11fa335c0165e202b4c011334c7bc8f4c4e570cf255190f4e3e2cbc9137ca57cb687947bc”)] P>

【讨论】:

  • 不要认为这是问题所在。当然不是在这个小复制品中。该程序集未签名
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多