【问题标题】:Moq >= 4.5.7 exposes Exception on It.IsAny<decimal>()Moq >= 4.5.7 在 It.IsAny<decimal>() 上公开异常
【发布时间】:2016-09-26 07:51:56
【问题描述】:

我使用的是最小起订量 4.5.3。并决定将 Moq Nuget 包更新到最新版本,即 4.5.8。
突然,我的很多测试开始失败。问题在于在可选参数上使用 It.IsAny&lt;decimal&gt; 时。
Bellow 是一个简单而愚蠢的测试来证明它:

public interface IFoo { bool Method(decimal decimalArg = 0m); }

public class Some
{
    public int SomeMethod(IFoo foo) => foo.Method(10m) ? 1 : 0;
}

[TestFixture]
public class SomeTests
{
    [Test]
    public void SampleTest()
    {
        var fooMock = new Mock<IFoo>();
        fooMock.Setup(m => m.Method(It.IsAny<decimal>())).Returns(true);

        var sut = new Some();
        var actual = sut.SomeMethod(fooMock.Object);

        Assert.That(actual, Is.EqualTo(1));
    }
}

我正在使用 .Net 4.6.1,nUnit 3.2.1。 返回的异常是:“system.decimal 不是受支持的常量类型”。

  • 有人对此问题有解释吗?
  • 是否有任何修复或解决方法?

【问题讨论】:

  • 这真的足以重现问题吗?这听起来像是一个在“发布”新版本之前很容易发现的问题。 m.Create 方法是否以明显的方式声明(如在 public IAccount Create(ITransactionalEntity x, decimal y) 中)还是涉及一些隐式类型转换?
  • 感谢您的回复,杰普。我刚刚发现是什么导致了这个问题。十进制参数是一个可选参数:IAccount Create(ITransactionalEntity owner, decimal initialBalance = 0m);。这里的主要问题是起订量发生了一些重大变化,因为这适用于起订量 4.5.3。
  • 您应该编辑您的问题以包含这些新信息。也许展示IAccountFactory 介绍Create 的部分。是否存在多个重载(包括可能的继承重载)?
  • 好的,我已经编辑了问题。我想现在它已经具备了重现问题所需的一切。
  • 公关会更好;)

标签: c# unit-testing moq


【解决方案1】:

参见thisCastle.Core 讨论。删除默认值将解决此特定测试中的问题,但可能不会解决所有测试中的问题。

【讨论】:

    猜你喜欢
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 2011-10-17
    • 1970-01-01
    • 2013-04-09
    相关资源
    最近更新 更多