Mock.Verify 使用列表的当前值,而不是调用正在验证的方法时列表的值

Mock.Verify uses current value of list, not the value of the list when the method being verified was called

我有这样一种情况,我正在 运行 进行单元测试并调用 Verify 来断言使用非空列表作为参数调用了一个方法。被测试的方法调用方法末尾列表中的Clear()。好像调用 Verify 时,它正在检查当前时间的列表状态,而不是调用我的函数时的状态。这是预期的行为吗?有什么方法可以让 Verify 在调用我的方法时使用列表的值?

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

namespace Tests
{
    [TestClass]
    public class UnitTest1
    {
        public interface IMyDependency
        {
            void ParseNumbers(List<int> numbers);
        }

        public class MyDependency : IMyDependency
        {
            public void ParseNumbers(List<int> numbers)
            {
            }
        }

        public class SystemUnderTest
        {
            private IMyDependency myDependency;

            public SystemUnderTest(IMyDependency myDependency)
            {
                this.myDependency = myDependency;
            }

            public void DoSomething(List<int> numbers)
            {
                this.myDependency.ParseNumbers(numbers);

                // This causes my test to fail because Verify thinks that ParseNumbers was called
                // with an empty list as the parameter, even though the list was not empty when
                // ParseNumbers was called
                numbers.Clear();
            }
        }

        [TestMethod]
        public void TestMethod1()
        {
            var myDependency = new Mock<IMyDependency>();
            var systemUnderTest = new SystemUnderTest(myDependency.Object);

            systemUnderTest.DoSomething(new List<int> { 1, 2, 3 });

            // This succeeds
            myDependency.Verify(e => e.ParseNumbers(It.IsAny<List<int>>()), Times.Once);
        
            // This fails
            myDependency.Verify(e => e.ParseNumbers(It.Is<List<int>>(m => m.Count > 0)), Times.Once);
        }
    }
}

Is that the expected behavior

看起来该行为可能是一个错误。我建议向开发者提出问题。

and is there any way to have Verify use the value of the list at the time that my method was called?

进行设置Verifiable

[TestMethod]
public void TestMethod1() {
    // Arrange
    var myDependency = new Mock<IMyDependency>();
    myDependency
        .Setup(e => e.ParseNumbers(It.Is<List<int>>(m => m.Count > 0)))
        .Verifiable(); //<-- MAKE SETUP VERIFIABLE

    var systemUnderTest = new SystemUnderTest(myDependency.Object);

    // Act
    systemUnderTest.DoSomething(new List<int> { 1, 2, 3 });

    // Assert
    myDependency.Verify(); // Verifies that all verifiable expectations have been met.
}