使用Moq验证只调用这两个方法调用,而不是其他任何方法

时间:2013-02-14 18:23:13

标签: unit-testing mocking tdd moq

我正在使用Moq进行验证和单元测试。我想验证一个方法'添加'是用参数1和参数5调用的,而没有调用用于除了那些之外的任何其他值。

是否可以创建类似于以下代码的验证? (注意这不是实际代码!)

mock.Verify(x=>x.Add(1), Times.Once());
mock.Verify(x=>x.Add(5), Times.Once());
mock.Verify(x=>x.Add(It.IsAny<int>()), Times.Never());

1 个答案:

答案 0 :(得分:2)

您可以尝试这样做,将lambda表达式传递给第三个验证,以排除任何不同于1和5的值。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;

namespace Tests.x21
{
    public interface IMyInterface
    {
        void Add(int num);
    }

    public class Executor
    {
        private IMyInterface _dep;

        public Executor(IMyInterface dep)
        {
            _dep = dep;
        }

        public void Execute()
        {
            _dep.Add(1);
            _dep.Add(5);
            _dep.Add(4);    // comment to make the test work
        }
    }

    [TestClass]
    public class UnitTest21
    {
        [TestMethod]
        public void TestMethod1()
        {
            var mock = new Mock<IMyInterface>();
            var executor = new Executor(mock.Object);
            executor.Execute();
            mock.Verify(x => x.Add(1), Times.Once());
            mock.Verify(x => x.Add(5), Times.Once());
            mock.Verify(m => m.Add(It.Is<int>(num => num != 1 && num != 5)), Times.Never());
        }
    }
}