无法开始使用Moq和Nunit

时间:2010-08-12 23:11:31

标签: c# nunit moq

我试着让一个非常简单的测试场景正常工作。 我确定我错过了一些非常简单的事情!

无论我做什么,在针对我的DLL运行测试时,我似乎从NUnit gui中得到以下错误: System.TypeLoadException:从程序集“DynamicProxyGenAssembly2,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null”键入“Castle.Proxies.ITestProxy”,尝试实现无法访问的界面。

现在我在堆栈溢出和其他地方看到大量地方引用了这个错误,但我一直找到的解决方案似乎没有帮助。而且我现在甚至没有使用内部接口!我在这个地方看到的解决方案也在AssemblyInfo.cs

中添加了以下行

[assembly:InternalsVisibleTo(“DynamicProxyGenAssembly2”)]

我正在使用:

  • Visual Studio 2010 Professional
  • c#4.0
  • Moq 4.10810.8 Beta(已部署bin)
  • NUnit 2.5.5(安装在GAC中)

要重新创建此错误,我需要做的就是:

  1. 创建新的类库项目
  2. 参考Moq和单位(如上所述)
  3. 创建一个界面。我把我的界面称为ITest,将其公之于众,它有一个方法是'string TestMethod();'。为简单起见,我在本地项目中这样做。
  4. 创建一个名为'Testing'的类,用[TextFixture]修饰,一个名为'TestMethod'的测试方法用[Test]
  5. 修饰
  6. 构建项目,然后针对Debug文件夹中生成的dll运行NUnit。
  7. 这是我的测试类的内容

    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后,一切正常!

3 个答案:

答案 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中均有效。