试图让一个非常简单的测试场景工作,让我的头靠在墙上.我确定我错过了一些非常简单的东西!
无论我做什么,当我对我的DLL运行测试时,我似乎从NUnit gui中得到以下错误: System.TypeLoadException:从程序集'DynamicProxyGenAssembly2输入'Castle.Proxies.ITestProxy',Version = 0.0.0.0,Culture = neutral, PublicKeyToken = null'正在尝试实现无法访问的接口.
现在,我在堆栈溢出和其他地方看到大量地方引用了这个错误,但我一直找到的解决方案似乎没有帮助.而且我现在甚至没有使用内部接口!我在这个地方看到的解决方案也在AssemblyInfo.cs中添加了以下行
[assembly:InternalsVisibleTo("DynamicProxyGenAssembly2")]
我正在使用:
要重新创建此错误,我需要做的就是:
这是我的测试类的内容
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);
}
}
Run Code Online (Sandbox Code Playgroud)
}
----更新--- 将Moq版本从4.10810.8更改为4.0.10501.6后一切正常!
以下测试通过我:
public interface ITest { string TestMethod(); }
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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您的界面是公共的并且在同一个程序集中,那么确实应该没有问题.我怀疑你在某个地方错过了一个accessibility关键字,因为非公共接口确实会引发运行时错误,因为代理程序集将无法基于它来实例化类型.
可能最好的做法是从我提供的代码开始,一次改变一件事,直到它与你的失败代码相匹配.如果你在每次更改之间运行测试,我认为你会找到遗漏的内容.
如果确实返回内部接口,请注意您的InternalsVisibleTo语句必须与内部接口位于同一程序集中,而不是测试程序集.另请注意,如果您的程序集具有强名称,则可能需要在InternalsVisibleTo语句中添加公钥指纹,如MSDN中所述.