【问题标题】:moq setup not returning expected value起订量设置未返回预期值
【发布时间】:2016-11-25 05:09:52
【问题描述】:

我正在使用 Nunit 和 Autofac 的 Moq 来设置测试

    [TestFixture]
public class SomeTests
{

    [OneTimeSetUp]
    public void Initialize()
    {

    }
    [Test]
    public void SalaryCheck()
    {                              
        using (var mock = AutoMock.GetLoose())
        {
            // Arrange
            mock.Mock<ICommonServices>().Setup(x => x.AddTwoNumbers(1,2)).Returns(5);
            var sut = mock.Create<SomeManager>(); 
            // Act
            int actul = sut.CalculateSalary(1);


            var expected = 5;


            // Assert
            Assert.AreEqual(expected, actul);

        }
    }
}

CalculateSalary 函数如下所示

  public int CalculateSalary(int hours)
    {
        var addres = _commonService.AddTwoNumbers(5,3);
        if (addres == 5)
        {
            return addres * hours;
        }
        else
        { 
            return  100;
        }
    }

我希望作为外部依赖项的 AddTwoNumbers 函数无论如何都返回 5。这就是为什么我在嘲笑它之后设置它。但是当我调试这个测试时,它看起来像是在计算薪水函数内部,但为 AddTwoNumbers 函数返回一个“0”。这是一种默认值或空值。

它不会返回 5,即我设置它返回的值。

【问题讨论】:

    标签: c# unit-testing mocking nunit


    【解决方案1】:

    在模拟返回抽象的方法时,请确保您对 It.IsAny() 的调用中的类型实际上与您正在模拟的方法的参数类型相匹配。

    给定一个将 IEnumerable 作为参数的方法:

    interface IQueueItemRepository {
      IQueueItem GetFirstNotIn(IEnumerable<Guid> guids)
    }
    

    在下面的示例中,.Setup 只会在 .GetFirstNotInCollection 作为参数调用时被调用。

    Mock<IQueueItemRepository> queueMock = new Mock<IQueueItemRepository>();
    
    queueMock
        .Setup(x => x.GetFirstNotIn(It.IsAny<Collection<Guid>>()))
        .Returns(new QueueItem());
    

    换句话说,如果您正在测试的代码从不使用 Collection 调用 .GetFirstNotIn,那么您的 .Setup 将永远不会被调用。它可能会在您的代码中以 IEnumerable 作为参数多次调用,但这些调用与 .Setup 不匹配。

    所以一定要让你的参数类型与你的 .Setup 类型相匹配:

    Mock<IQueueItemRepository> queueMock = new Mock<IQueueItemRepository>();
    
    queueMock
        .Setup(x => x.GetFirstNotIn(It.IsAny<IEnumerable<Guid>>()))
        .Returns(new QueueItem());
    

    【讨论】:

    • 我连续调试了近 3 个小时的测试......只是在阅读了这个答案后才发现,我在方法中有可以为空的参数(在测试中我通过了标准参数)。谢谢! :)
    【解决方案2】:

    您需要使用It.IsAny&lt;int&gt;()

    mock.Mock<ICommonServices>().Setup(x => x.AddTwoNumbers(It.IsAny<int>(),It.IsAny<int>())).Returns(5);
    

    【讨论】:

      猜你喜欢
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 2016-02-13
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多