moq设置未返回预期值

时间:2016-07-21 14:33:02

标签: c# unit-testing mocking nunit

我正在使用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。这就是为什么我在嘲笑之后设置它。但是,当我调试这个测试时,看起来它进入了calsulate薪水函数,但返回一个&#34; 0&#34;用于AddTwoNumbers功能。这是一种默认值或空值。

它没有归还我5,即我将其设置为返回。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

给出一个采用 IEnumerable 作为参数的方法:

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

在下面的示例中,仅当使用 Collection 作为参数调用 .GetFirstNotIn 时,才会调用 .Setup

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