我试着让一个非常简单的测试场景正常工作。 我确定我错过了一些非常简单的事情!
无论我做什么,在针对我的DLL运行测试时,我似乎从NUnit gui中得到以下错误: System.TypeLoadException:从程序集“DynamicProxyGenAssembly2,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null”键入“Castle.Proxies.ITestProxy”,尝试实现无法访问的界面。
现在我在堆栈溢出和其他地方看到大量地方引用了这个错误,但我一直找到的解决方案似乎没有帮助。而且我现在甚至没有使用内部接口!我在这个地方看到的解决方案也在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);
}
}
}
----更新--- 将Moq版本从4.10810.8更改为4.0.10501.6后,一切正常!
答案 0 :(得分: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);
}
}
如果您的界面是公共的并且在同一个程序集中,那么确实应该没有问题。我怀疑你在某个地方错过了一个辅助功能关键字,因为非公共接口确实会引发运行时错误,因为代理程序集将无法基于它实例化类型。
可能最好的做法是从我提供的代码开始,一次更改一件事,直到它与失败的代码匹配。如果您在每次更改之间运行测试,我认为您会找到遗漏的内容。
如果您确实返回内部界面,请注意您的InternalsVisibleTo
语句必须与与内部接口相同的程序集而不是您的测试程序集。另请注意,如果您的程序集为strongly named,则可能需要在InternalsVisibleTo
语句中添加公钥指纹described in MSDN。
答案 1 :(得分:4)
是的,我对于NET40的Moq.4.0.10810.8也有同样的问题......当我降级到版本4.0.10531.7时,一切都再次变为绿色!
答案 2 :(得分:0)
我现在正在使用4.10.1,并且遇到了同样的问题。我尝试降级为4.10.0,但无济于事。
我终于发现,尽管我使用的接口被标记为public,但它在没有修饰符的类中。我发现有2件事使它起作用:
1)将界面拉出课堂。因为该类不再使接口内部化,所以程序集可以访问它。 2)将班级标记为公开。到接口路径的所有部分都标记为公共,程序集的访问没有问题。
这些策略在4.10.0和4.10.1中均有效。