首页 文章

无法开始使用Moq和Nunit

提问于
浏览
14

试图让一个非常简单的测试场景工作,让我的头靠在墙上 . 我确定我错过了一些非常简单的东西!

无论我做什么,当我对我的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 回答

  • 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);
        }
    }
    

    如果您的界面是公共的并且在同一个程序集中,那么确实应该没有问题 . 我怀疑你在某个地方错过了一个accessibility关键字,因为非公共接口确实会引发运行时错误,因为代理程序集将无法基于它来实例化类型 .

    可能最好的做法是从我提供的代码开始,一次改变一件事,直到它与你的失败代码相匹配 . 如果你在每次更改之间运行测试,我认为你会找到遗漏的内容 .

    如果确实返回内部接口,请注意 InternalsVisibleTo 语句必须与内部接口位于同一程序集中,而不是测试程序集 . 另请注意,如果程序集是strongly named,则可能需要将公钥指纹添加到 InternalsVisibleTo 语句中described in MSDN .

  • 4

    是的,我对于NET40的Moq.4.0.10810.8也有同样的问题...当我降级到版本4.0.10531.7时,一切都再次变为绿色!

  • 0

    我现在正在使用4.10.1,我也遇到了同样的问题 . 我尝试降级到4.10.0,但无济于事 .

    我终于发现,尽管我使用的界面被标记为公共,但它是在没有修饰符的类中 . 我找到了2件事情让它起作用:

    1)将界面拉到课外 . 因为类不再使接口内部化,所以程序集可以访问它 . 2)将 class 标记为公开 . 将接口路径的所有部分标记为public,程序集访问时没有任何问题 .

    这些策略在4.10.0和4.10.1中都有效 .

相关问题