最小起订量设置未返回预期值

moq setup not returning expected value

我正在使用 Nunit 和 Autofac 的最小起订量来设置测试

    [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 函数,它是一个外部依赖项,无论如何都要 return 5。这就是为什么我在嘲笑它之后设置它。但是当我调试这个测试时,它看起来像是进入了 calsulate salary 函数,但是 return 是 AddTwoNumbers 函数的“0”。这是一种默认值或空值。

它不会 return 我 5 即我将其设置为 return。

您需要使用It.IsAny<int>()

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

当模拟一个 returns 抽象的方法时,确保你调用 It.IsAny< YourType >() 的类型与您正在模拟的方法的参数类型。

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

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

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

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());