MOQ 4.0:'Moq.Mock`1'的类型初始值设定项引发了异常

Ben*_*ter 7 nunit moq mocking

我得到了例外

'Moq.Mock`1'的类型初始值设定项引发了异常.

使用Moq 4.0我已经在几个论坛上查看过,他们提到使用Moq-NoCastle版本.我在Moq文件夹中尝试了这个和版本.两者都有相同的结果.

我有一个包含2个项目的解决方案,一个用于我的界面,一个用于我的测试.我的主项目有2个文件:

IMyInterface.cs:

using System;

namespace Prototype
{
    public interface IMyInterface
    {
        int Value { get; set; }
        void ProcessValue();
        int GetValue();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的program.cs文件只包含项目生成的默认代码.

我的测试项目有一个单独的文件用于我的虚拟测试 - TestProgram.cs

using System;
using NUnit.Framework;
using Moq;

namespace Prototype.UnitTests
{
    [TestFixture]
    public class TestProgram
    {
        Mock<IMyInterface> mock;

        [TestFixtureSetUp]
        void TestSetup()
        {
            mock = new Mock<IMyInterface>();
            mock.Setup(x => x.GetValue()).Returns(2);
        }

        [Test]
        public void RunTest()
        {
            IMyInterface obj = mock.Object; /* This line fails */
            int val = obj.GetValue();
            Assert.True(val == 2);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

根据文档,所有内容都很好,并且编译得很好.当我尝试运行测试时出现问题.它到达上面标记的行并崩溃,但有异常:

'Moq.Mock`1'的类型初始值设定项引发了异常.

我看不出这里出了什么问题,有人能说清楚吗?

小智 9

当我将Castle.Core NuGet包更新到版本4.0.0时,我发生了这种情况.在这一刻,最新的Moq(v4.5.30)改变了一些不能正常工作的东西.

我通过回到Castle.Core版本3.3.3解决了这个问题.


Jef*_*ata 4

进行以下更改后,我能够成功运行您的测试:

  1. 公开TestSetup()
  2. 在 中RunTest,更改int val = obj.Valueint val = obj.GetValue()- 这只是为了让Assert通过。

我不熟悉 NUnit(我使用 xUnit),但我猜问题是 TestSetup() 是私有的。当该方法是私有的时,NUnit 会向我显示此异常:

Prototype.UnitTests.TestProgram.RunTest:
Invalid signature for SetUp or TearDown method: TestSetup
Run Code Online (Sandbox Code Playgroud)

也许您使用的是旧版本的 NUnit,它以不同的方式处理这种情况(我刚刚下载了 2.5.7.10213)。

华泰