试图让一个非常简单的测试场景工作,让我的头靠在墙上 . 我确定我错过了一些非常简单的东西!
无论我做什么,当我对我的DLL运行测试时,我似乎从NUnit gui得到以下错误: System.TypeLoadException : Type 'Castle.Proxies.ITestProxy' from assembly 'DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is attempting to implement an inaccessible interface.
现在,我在堆栈溢出和其他地方看到大量地方引用了这个错误,但我一直找到的解决方案似乎没有帮助 . 而且我现在甚至没有使用内部接口!我在这个地方看到的解决方案也在AssemblyInfo.cs中添加了以下行
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
我正在使用:
-
Visual Studio 2010 Professional
-
c#4.0
-
Moq 4.10810.8 Beta(已部署bin)
-
NUnit 2.5.5(安装在GAC中)
要重新创建此错误,我需要做的就是:
-
创建一个新的类库项目
-
参考Moq和单位(如上)
-
创建一个界面 . 我've called my interface ITest, made it public, and it has one method which is ' string TestMethod();' . 为简单起见,我在本地项目中这样做 .
-
创建一个名为'Testing'的类,用[TextFixture]修饰,一个名为'TestMethod'的测试方法用[Test]修饰
-
构建项目,然后对Debug文件夹中生成的dll运行NUnit .
这是我的测试类的内容
namespace MoqTest {
[TestFixture]
public class Testing {
[Test]
public void TestMethod() {
var testMock = new Mock<ITest>();
testMock.Setup(x => x.TestMethod()).Returns("String val");
var xyz = testMock.Object;
Assert.AreEqual(1, 1);
}
}
}
---- UPDATE --- 将Moq版本从4.10810.8更改为4.0.10501.6后一切正常!
3 回答
以下测试通过我:
如果您的界面是公共的并且在同一个程序集中,那么确实应该没有问题 . 我怀疑你在某个地方错过了一个accessibility关键字,因为非公共接口确实会引发运行时错误,因为代理程序集将无法基于它来实例化类型 .
可能最好的做法是从我提供的代码开始,一次改变一件事,直到它与你的失败代码相匹配 . 如果你在每次更改之间运行测试,我认为你会找到遗漏的内容 .
如果确实返回内部接口,请注意
InternalsVisibleTo
语句必须与内部接口位于同一程序集中,而不是测试程序集 . 另请注意,如果程序集是strongly named,则可能需要将公钥指纹添加到InternalsVisibleTo
语句中described in MSDN .是的,我对于NET40的Moq.4.0.10810.8也有同样的问题...当我降级到版本4.0.10531.7时,一切都再次变为绿色!
我现在正在使用4.10.1,我也遇到了同样的问题 . 我尝试降级到4.10.0,但无济于事 .
我终于发现,尽管我使用的界面被标记为公共,但它是在没有修饰符的类中 . 我找到了2件事情让它起作用:
1)将界面拉到课外 . 因为类不再使接口内部化,所以程序集可以访问它 . 2)将 class 标记为公开 . 将接口路径的所有部分标记为public,程序集访问时没有任何问题 .
这些策略在4.10.0和4.10.1中都有效 .